Saltar al contenido

¿Cuál es el significado de los corchetes dobles para el [[prototype]]propiedad en JavaScript?

Solución:

Es un “propiedad interna“del objeto. De ECMAScript 8.6.2:

Esta especificación utiliza varias propiedades internas para definir la semántica de los valores de los objetos. Estas propiedades internas no forman parte del lenguaje ECMAScript. Se definen en esta especificación únicamente con fines expositivos. Una implementación de ECMAScript debe comportarse como si produjera y operara sobre propiedades internas de la manera descrita aquí. Los nombres de las propiedades internas se encierran entre corchetes dobles [[ ]].

La declaración, “Estas propiedades internas no son parte del lenguaje ECMAScript”, significa que las propiedades internas no son identificadores que se puedan usar en el código real; las propiedades internas no son accesibles como miembros de los objetos que las contienen. Sin embargo, ellos mayo ser hecha accesible por funciones o propiedades particulares (por ejemplo, algunos navegadores tienen la amabilidad de permitirle configurar y obtener [[Prototype]] a través de __proto__ propiedad, y la especificación ES5 permite el acceso de solo lectura a través de Object.getPrototypeOf).

El uso de corchetes dobles sobre corchetes simples es probablemente para evitar cualquier posible confusión con la notación de corchetes real (es decir, acceso a la propiedad).

JavaScript [[Prototype]]

El soporte doble [[Prototype]] es un enlace interno que ata un objeto a otro.

Al crear una función, un objeto de propiedad llamado prototipo se está creando y agregando a la variable de nombre de la función (que llamamos constructor). Este objeto apunta o tiene un enlace interno-privado al objeto JavaScript nativo).

Ejemplo:

function Foo () {
    this.name="John Doe";
}

// Foo has an object 'property' called prototype 
// prototype was created automatically when we declared the function Foo.
// Now, we can assign properties to it without declaring the prototype object first.
Foo.prototype.myName = function () {
    return 'My name is ' + this.name;
}

Ahora, si crearemos un nuevo objeto a partir de Foo utilizando el new palabra clave, básicamente creamos (entre otras cosas) un nuevo objeto que tiene un enlace interno al prototipo de la función (Foo) discutimos anteriormente:

var obj = new Foo();

obj.__proto__ === Foo.prototype      // true
obj.[[Prototype]] === Foo.prototype  // true

como

obj.__proto__ === obj.[[Prototype]]  // true

Ya que [[Prototype]] es un enlace privado al objeto de esa función, muchos navegadores nos proporcionan un enlace público en su lugar. Eso es el __proto__ (pronunciado como dunder proto).

__proto__ es en realidad una función getter que pertenece al objeto JavaScript nativo y devuelve el enlace prototipo interno-privado de lo que sea this vinculante es (devuelve el [[Prototype]] de obj):

obj.__proto__ === Foo.prototype // true

Por cierto, a partir de ES5, podemos usar el getPrototypeOf método para obtener el enlace privado interno:

obj.__proto__ === Object.getPrototypeOf(obj) // true

NOTA: esta respuesta no pretende cubrir todo el proceso de creación de nuevos objetos o nuevos constructores, sino ayudar a comprender mejor cuál es el [[Prototype]] y como funciona.

La razón por la que está entre paréntesis es para indicar que es una propiedad privada. Los corchetes en sí mismos nunca se usan en el código en ningún lugar.

Como señaló, algunas implementaciones brindan acceso a esa propiedad privada bajo __proto__, pero no es estándar.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *