diff options
Diffstat (limited to 'files/es/web/javascript/referencia/classes/private_class_fields/index.html')
-rw-r--r-- | files/es/web/javascript/referencia/classes/private_class_fields/index.html | 201 |
1 files changed, 0 insertions, 201 deletions
diff --git a/files/es/web/javascript/referencia/classes/private_class_fields/index.html b/files/es/web/javascript/referencia/classes/private_class_fields/index.html deleted file mode 100644 index 5826cc125b..0000000000 --- a/files/es/web/javascript/referencia/classes/private_class_fields/index.html +++ /dev/null @@ -1,201 +0,0 @@ ---- -title: Private class fields -slug: Web/JavaScript/Referencia/Classes/Private_class_fields -translation_of: Web/JavaScript/Reference/Classes/Private_class_fields ---- -<div> -<p><font><font>Las propiedades de la clase son públicas de forma predeterminada y se pueden examinar o modificar fuera de la clase. </font><font>Sin embargo, existe </font></font><a class="external" href="https://translate.googleusercontent.com/translate_c?depth=1&pto=aue&rurl=translate.google.com&sl=en&sp=nmt4&tl=es&u=https://github.com/tc39/proposal-class-fields&usg=ALkJrhgmG5nvuZjYd2YQRSuRJHti_gdXeQ" rel="noopener"><font><font>una propuesta experimental</font></font></a><font><font> para permitir la definición de campos de clase privados utilizando un </font></font><code>#</code><font><font>prefijo </font><font>hash </font><font>.</font></font></p> -</div> - -<h2 id="Syntax">Syntax</h2> - -<pre class="syntaxbox notranslate">class ClassWithPrivateField { - #privateField -} - -class ClassWithPrivateMethod { - #privateMethod() { - return 'hello world' - } -} - -class ClassWithPrivateStaticField { - static #PRIVATE_STATIC_FIELD -} -</pre> - -<h3 id="Campos_estáticos_privados"><font><font>Campos estáticos privados </font></font></h3> - -<p><font><font>Los campos privados son accesibles en el constructor de clases desde dentro de la propia declaración de clases.</font></font></p> - -<p><font><font>La limitación de las variables estáticas que se llaman solo por métodos estáticos aún se mantiene</font></font></p> - -<pre class="brush: js notranslate">class ClassWithPrivateStaticField { - static #PRIVATE_STATIC_FIELD - - static publicStaticMethod() { - ClassWithPrivateStaticField.#PRIVATE_STATIC_FIELD = 42 - return ClassWithPrivateStaticField.#PRIVATE_STATIC_FIELD - } -} - -console.assert(ClassWithPrivateStaticField.publicStaticMethod() === 42)</pre> - -<p><font><font>Los campos estáticos privados se agregan al constructor de la clase en el momento de la evaluación de la clase.</font></font></p> - -<p><font><font>Existe una restricción de procedencia en los campos estáticos privados. </font><font>Solo la clase que define el campo estático privado puede acceder al campo.</font></font></p> - -<p><font><font>Esto puede conducir a un comportamiento inesperado al usar </font></font><strong><code>this</code></strong><font><font>.</font></font></p> - -<pre class="brush: js notranslate">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) -</pre> - -<h3 id="Campos_de_instancia_privados"><font><font>Campos de instancia privados</font></font></h3> - -<p><font><font>Los campos de instancia privados se declaran con </font></font><strong><font><font># nombres </font></font></strong><font><font> (pronunciados " </font></font><em><font><font>nombres hash</font></font></em><font><font> "), que son identificadores con el prefijo </font></font><code>#</code><font><font>. </font><font>El </font></font><code>#</code><font><font>es una parte del nombre propio. </font><font>También se utiliza para la declaración y el acceso.</font></font></p> - -<p><font><font>La encapsulación es impuesta por el lenguaje. </font><font>Es un error de sintaxis referirse a </font></font><code>#</code><font><font>nombres que están fuera del alcance.</font></font></p> - -<pre class="brush: js notranslate">class ClassWithPrivateField { - #privateField - - constructor() { - this.#privateField = 42 - this.#randomField = 666 // Syntax error - } -} - -const instance = new ClassWithPrivateField() -instance.#privateField === 42 // Syntax error -</pre> - -<h3 id="Métodos_privados"><font><font>Métodos privados</font></font></h3> - -<h4 id="Métodos_estáticos_privados"><font><font>Métodos estáticos privados</font></font></h4> - -<p><font><font>Al igual que su equivalente público, los métodos estáticos privados se invocan en la propia clase, no en instancias de la clase. </font><font>Al igual que los campos estáticos privados, solo se puede acceder a ellos desde dentro de la declaración de clase.</font></font></p> - -<p><font><font>Los métodos estáticos privados pueden ser funciones generadoras, asíncronas y asíncronas.</font></font></p> - -<pre class="brush: js notranslate">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); -</pre> - -<p><font><font>Esto puede conducir a un comportamiento inesperado al usar </font></font><strong><code>this</code></strong><font><font>. </font><font>En el siguiente ejemplo se </font></font><code>this</code><font><font>hace referencia a la </font></font><code>Derived</code><font><font>clase (no a la </font></font><code>Base</code><font><font>clase) cuando intentamos llamar </font></font><code>Derived.publicStaticMethod2()</code><font><font>, y por lo tanto exhibe la misma "restricción de procedencia" que se mencionó anteriormente:</font></font></p> - -<pre class="brush: js notranslate">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 -</pre> - -<h4 id="Métodos_de_instancia_privada"><font><font>Métodos de instancia privada</font></font></h4> - -<p><font><font>Los métodos de instancia privada son métodos disponibles en instancias de clase cuyo acceso está restringido de la misma manera que los campos de instancia privada.</font></font></p> - -<pre class="brush: js notranslate">class ClassWithPrivateMethod { - #privateMethod() { - return 'hello world' - } - - getPrivateMessage() { - return this.#privateMethod() - } -} - -const instance = new ClassWithPrivateMethod() -console.log(instance.getPrivateMessage()) -// expected output: "hello world"</pre> - -<p><font><font>Los métodos de instancia privada pueden ser funciones generadoras, asíncronas o asíncronas. </font><font>Los getters y setters privados también son posibles:</font></font></p> - -<pre class="brush: js notranslate">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✨" -</pre> - -<h2 id="Specifications">Specifications</h2> - -<table class="standard-table"> - <thead> - <tr> - <th scope="col">Specification</th> - </tr> - </thead> - <tbody> - <tr> - <td>{{SpecName('Public and private instance fields', '#prod-FieldDefinition', 'FieldDefinition')}}</td> - </tr> - </tbody> -</table> - -<h2 id="Browser_compatibility">Browser compatibility</h2> - - - -<p>{{Compat("javascript.classes.private_class_fields")}}</p> - -<h2 id="See_also">See also</h2> - -<ul> - <li><a href="/en-US/docs/Web/JavaScript/Reference/Classes/Public_class_fields">Public class fields</a></li> - <li><a href="https://rfrn.org/~shu/2018/05/02/the-semantics-of-all-js-class-elements.html">The Semantics of All JS Class Elements</a></li> -</ul> |