[ Web Proxy ]
URL:
Viewing: https://developer.mozilla.org/es/docs/Web/JavaScript/Reference/Classes/Private_elements [Back]  [Original]

Private class fields - JavaScript | MDN

Esta pgina ha sido traducida del ingls por la comunidad. Aprende ms y nete a la comunidad de MDN Web Docs.

View in English Always switch to English

Private class fields

Baseline Widely available

This feature is well established and works across many devices and browser versions. Its been available across browsers since julio de 2021.

Las propiedades de la clase son pblicas de forma predeterminada y se pueden examinar o modificar fuera de la clase. Sin embargo, existe una propuesta experimental para permitir la definicin de campos de clase privados utilizando un # prefijo hash .

In this article

Syntax

js
class ClassWithPrivateField {
  #privateField;
}

class ClassWithPrivateMethod {
  #privateMethod() {
    return "hello world";
  }
}

class ClassWithPrivateStaticField {
  static #PRIVATE_STATIC_FIELD;
}

Campos estticos privados

Los campos privados son accesibles en el constructor de clases desde dentro de la propia declaracin de clases.

La limitacin de las variables estticas que se llaman solo por mtodos estticos an se mantiene

js
class ClassWithPrivateStaticField {
  static #PRIVATE_STATIC_FIELD;

  static publicStaticMethod() {
    ClassWithPrivateStaticField.#PRIVATE_STATIC_FIELD = 42;
    return ClassWithPrivateStaticField.#PRIVATE_STATIC_FIELD;
  }
}

console.assert(ClassWithPrivateStaticField.publicStaticMethod() === 42);

Los campos estticos privados se agregan al constructor de la clase en el momento de la evaluacin de la clase.

Existe una restriccin de procedencia en los campos estticos privados. Solo la clase que define el campo esttico privado puede acceder al campo.

Esto puede conducir a un comportamiento inesperado al usar this.

js
class BaseClassWithPrivateStaticField {
  static #PRIVATE_STATIC_FIELD;

  static basePublicStaticMethod() {
    this.#PRIVATE_STATIC_FIELD = 42;
    return this.#PRIVATE_STATIC_FIELD;
  }
}

class SubClass extends BaseClassWithPrivateStaticField {}

let error = null;

try {
  SubClass.basePublicStaticMethod();
} catch (e) {
  error = e;
}

console.assert(error instanceof TypeError);

Campos de instancia privados

Los campos de instancia privados se declaran con # nombres (pronunciados " nombres hash "), que son identificadores con el prefijo #. El # es una parte del nombre propio. Tambin se utiliza para la declaracin y el acceso.

La encapsulacin es impuesta por el lenguaje. Es un error de sintaxis referirse a # nombres que estn fuera del alcance.

js
class ClassWithPrivateField {
  #privateField;

  constructor() {
    this.#privateField = 42;
    this.#randomField = 666; // Syntax error
  }
}

const instance = new ClassWithPrivateField();
instance.#privateField === 42; // Syntax error

Mtodos privados

Mtodos estticos privados

Al igual que su equivalente pblico, los mtodos estticos privados se invocan en la propia clase, no en instancias de la clase. Al igual que los campos estticos privados, solo se puede acceder a ellos desde dentro de la declaracin de clase.

Los mtodos estticos privados pueden ser funciones generadoras, asncronas y asncronas.

js
class ClassWithPrivateStaticMethod {
  static #privateStaticMethod() {
    return 42;
  }

  static publicStaticMethod1() {
    return ClassWithPrivateStaticMethod.#privateStaticMethod();
  }

  static publicStaticMethod2() {
    return this.#privateStaticMethod();
  }
}

console.assert(ClassWithPrivateStaticMethod.publicStaticMethod1() === 42);
console.assert(ClassWithPrivateStaticMethod.publicStaticMethod2() === 42);

Esto puede conducir a un comportamiento inesperado al usar this. En el siguiente ejemplo se this hace referencia a la Derived clase (no a la Base clase) cuando intentamos llamar Derived.publicStaticMethod2(), y por lo tanto exhibe la misma "restriccin de procedencia" que se mencion anteriormente:

js
class Base {
  static #privateStaticMethod() {
    return 42;
  }
  static publicStaticMethod1() {
    return Base.#privateStaticMethod();
  }
  static publicStaticMethod2() {
    return this.#privateStaticMethod();
  }
}

class Derived extends Base {}

console.log(Derived.publicStaticMethod1()); // 42
console.log(Derived.publicStaticMethod2()); // TypeError

Mtodos de instancia privada

Los mtodos de instancia privada son mtodos disponibles en instancias de clase cuyo acceso est restringido de la misma manera que los campos de instancia privada.

js
class ClassWithPrivateMethod {
  #privateMethod() {
    return "hello world";
  }

  getPrivateMessage() {
    return this.#privateMethod();
  }
}

const instance = new ClassWithPrivateMethod();
console.log(instance.getPrivateMessage());
// expected output: "hello world"

Los mtodos de instancia privada pueden ser funciones generadoras, asncronas o asncronas. Los getters y setters privados tambin son posibles:

js
class ClassWithPrivateAccessor {
  #message;

  get #decoratedMessage() {
    return `${this.#message}`;
  }
  set #decoratedMessage(msg) {
    this.#message = msg;
  }

  constructor() {
    this.#decoratedMessage = "hello world";
    console.log(this.#decoratedMessage);
  }
}

new ClassWithPrivateAccessor();
// expected output: "hello world"

Especificaciones

Specification
ECMAScript 2027 LanguageSpecification
# prod-PrivateIdentifier

Compatibilidad con navegadores

javascript.classes.private_class_fields

javascript.classes.private_class_fields_in

javascript.classes.private_class_methods

See also


Web Proxy Viewer  |  New URL  |  Original Page