| [ Web Proxy ] |
| Viewing: https://developer.mozilla.org/es/docs/Web/JavaScript/Reference/Classes/Private_elements | [Back] [Original] |
Get to know MDN better
Esta pgina ha sido traducida del ingls por la comunidad. Aprende ms y nete a la comunidad de MDN Web Docs.
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 .
class ClassWithPrivateField {
#privateField;
}
class ClassWithPrivateMethod {
#privateMethod() {
return "hello world";
}
}
class ClassWithPrivateStaticField {
static #PRIVATE_STATIC_FIELD;
}
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
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.
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);
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.
class ClassWithPrivateField {
#privateField;
constructor() {
this.#privateField = 42;
this.#randomField = 666; // Syntax error
}
}
const instance = new ClassWithPrivateField();
instance.#privateField === 42; // Syntax error
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.
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:
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
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.
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:
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"
| Specification |
|---|
| ECMAScript 2027 LanguageSpecification # prod-PrivateIdentifier |
This page was last modified on 1 jul 2025 by MDN contributors.
Your blueprint for a better internet.
Portions of this content are 19982026 by individual mozilla.org contributors. Content available under a Creative Commons license.
| Web Proxy Viewer | New URL | Original Page |