Pregunta

http://www.jibbering.com/faq/faq_notes/closures.html :

  

Nota: ECMAScript define una propiedad interna [] [Prototype] del tipo de objeto interno. Esta propiedad no es directamente accesible con guiones, pero es la cadena de objetos que se hace referencia con el interno [[prototipo]] propiedad que se utiliza en la resolución de acceso de propiedad; cadena de prototipo del objeto. Una propiedad prototipo pública existe para permitir la asignación, definición y manipulación de los prototipos en asociación con la propiedad interna [[Prototype]]. Los detalles de la relación entre dos se describen en ECMA 262 (tercera edición) y están más allá del alcance de esta discusión.

¿Cuáles son los detalles de la relación entre los dos? He navegado a través de ECMA 262 y todo lo que he leído hay cosas como:

  

prototipo asociada del constructor puede ser referenciado por la expresión constructor.prototype programa,

     objetos

Nativo ECMAScript tienen una propiedad interna llamada [[Prototype]]. El valor de esta propiedad es o bien nulo o un objeto y se utiliza para la aplicación de la herencia.

     

Cada función integrada y cada constructor de fábrica tiene el objeto prototipo de función, que es el valor inicial de la expresión Function.prototype

     

Cada objeto prototipo de fábrica tiene el objeto prototipo de objeto, que es el valor inicial de la expresión   Object.prototype (15.3.2.1), como el valor de su interior [[Prototype]] propiedad, excepto el Objeto   prototipo propio objeto.

A partir de todo esto deduzco es que el [[] Prototype] propiedad es equivalente a la propiedad prototype para casi cualquier objeto. ¿Estoy equivocado?

¿Fue útil?

Solución

Creo que tiene razón en la mayoría de los casos.

Cada objeto tiene una propiedad [[Prototype]] oculta, que se utiliza para la herencia. Funciones adicionalmente tienen una propiedad prototype público, que se utiliza sólo cuando la función se utiliza como constructor: Cuando un objeto se construye utilizando new, la propiedad [[Prototype]] del nuevo objeto se establece en la propiedad prototype de la función que se usó como constructor.

por ejemplo.

function C() {}
C.prototype = P1;  
var obj = new C();  // obj.[[Prototype]] is now P1.

Puede obtener la propiedad [[Prototype]] usando Object.getPrototypeOf(<obj>). (Este método se especifica en ECMAScript 5. Las versiones anteriores de JavaScript no tiene un modo estándar de [[Prototype]] lectura).

Puede general llegar al prototipo a través del constructor, por ejemplo:.

obj.constructor.prototype == Object.getPrototypeOf(obj) 

Pero esto no es siempre el caso, ya que la propiedad prototipo de la función constructora puede ser reasignado, pero el [[Prototype]] de un objeto no puede ser reasignado después de crear el objeto. Así que si lo hace:

C.prototype = P2;

entonces

obj.constructor.prototype != Object.getPrototypeOf(obj)

Debido a que el prototipo de C es ahora P2, pero [[Prototype]] de obj sigue siendo P1.

Tenga en cuenta que se trata de solamente funciones que tienen una propiedad prototype. Tenga en cuenta también que la propiedad prototype de una función no es la misma que la propiedad [[Prototype]] de la función!

Otros consejos

Para responder a su pregunta directamente: lógicamente es la copia privada de un objeto de la propiedad prototype de su constructor. El uso de metalenguaje así es como se crean los objetos:

// not real JS

var Ctr = function(...){...};
Ctr.prototype = {...}; // some object with methods and properties

// the object creation sequence: var x = new Ctr(a, b, c);
var x = {};
x["[[prototype]]"] = Ctr.prototype;
var result = Ctr.call(x, a, b, c);
if(typeof result == "object"){ x = result; }
// our x is fully constructed and initialized at this point

En este punto, podemos modificar el prototipo, y el cambio se reflejará en todos los objetos de la clase, ya que se refieren al prototipo por referencia:

Ctr.prototype.log = function(){ console.log("...logging..."); };

x.log();  // ...logging..

Pero si cambiamos el prototipo en el constructor, los objetos ya creados seguirán refiriéndose al antiguo objeto:

Ctr.prototype = {life: 42};
// let's assume that the old prototype didn't define "life"

console.log(x.life);  // undefined
x.log();              // ...logging...

En la plena conformidad con la [[prototype]] estándar no está disponible, pero Mozilla extiende el estándar con la propiedad __proto__ (sólo lectura), que está exponiendo el [[prototype]] normalmente oculto:

Una vez más, __proto__ puede ser legalizado en la siguiente ES3.1 estándar.

Además de olavk de respuesta: Algunas implementaciones de JavaScript (por ejemplo, de Mozilla ) permiten acceder a la [[Prototype]] propiedad directamente ...

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top