Private class fields
Baseline
Widely available
This feature is well established and works across many devices and browser versions. It’s been available across browsers since julio de 2021.
Las propiedades de la clase son públicas de forma predeterminada y se pueden examinar o modificar fuera de la clase. Sin embargo, existe una propuesta experimental para permitir la definición de campos de clase privados utilizando un # prefijo hash .
Syntax
class ClassWithPrivateField {
#privateField;
}
class ClassWithPrivateMethod {
#privateMethod() {
return "hello world";
}
}
class ClassWithPrivateStaticField {
static #PRIVATE_STATIC_FIELD;
}
Campos estáticos privados
Los campos privados son accesibles en el constructor de clases desde dentro de la propia declaración de clases.
La limitación de las variables estáticas que se llaman solo por métodos estáticos aún se mantiene
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 estáticos privados se agregan al constructor de la clase en el momento de la evaluación de la clase.
Existe una restricción de procedencia en los campos estáticos privados. Solo la clase que define el campo estático privado puede acceder al campo.
Esto puede conducir a un comportamiento inesperado al usar this.
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. También se utiliza para la declaración y el acceso.
La encapsulación es impuesta por el lenguaje. Es un error de sintaxis referirse a # nombres que están fuera del alcance.
class ClassWithPrivateField {
#privateField;
constructor() {
this.#privateField = 42;
this.#randomField = 666; // Syntax error
}
}
const instance = new ClassWithPrivateField();
instance.#privateField === 42; // Syntax error