2010-11-01 19 views
6

Sé que la propiedad prototype de los objetos de función de JavaScript se copia en la propiedad interna [[Prototype]] (a.k.a. __proto__) de los objetos instanciados mediante la función como constructor. Por lo tanto, puedo establecer esta propiedad a cualquier objeto que quiero actuar como el prototipo:¿Cuál es el valor inicial de la propiedad del prototipo de una función de JavaScript?

function Foo() {} 
Foo.prototype = { 
    toString: function() { return "I'm a Foo!"; } 
} 
new Foo().toString() 
// --> "I'm a Foo!" 

Parece que es una práctica generalizada para agregar funciones que deben actuar como métodos de la clase a la prototipo del recién existentes funciones generadas como este:

function Bar() {} 
Bar.prototype.toString = function() { 
    return "I'm a Bar!"; 
} 
new Bar().toString() 
// --> "I'm a Bar!" 

No está claro para mí, sin embargo, lo que el valor inicial de la propiedad es prototype.

function Baz() {} 
Baz.prototype 
// --> Baz { 
//  constructor: function Baz() {}, 
//  __proto__: Object 
//  } 

El comentario muestra qué se imprime la consola de JavaScript de Chrome. ¿Esto significa que cada función que creo realmente crea dos objetos? Uno para la función en sí (el constructor) y otro para su prototipo.

¿Está esto definido en alguna parte del estándar ECMAScript? Traté de encontrarlo pero no pude. ¿Todos los navegadores manejan esto de la misma manera?

Respuesta

10

El valor inicial de prototype en cualquier recién creado Function ejemplo es una nueva instancia de Object, pero con el conjunto de propia propiedad constructor a punto de volver a la nueva función.

Esto se describe de manera completamente-ilegible típico ECMAScript-Spec por ECMA262-5 en la sección 13.2:

(16.) Que proto ser el resultado de la creación de un nuevo objeto como sería construido por la expresión new Object() donde Object es el estándar incorporado en el constructor con ese nombre

(17.) Llamar al método interno [[DefineOwnProperty]] de proto con argumentos "constructor", propiedad de descriptor {[[Valor]]: F, {[[Escribir]]: verdadero, [[Enumerable]]: falso, [[Configurable]]: verdadero} y falso.

(18.) Llame al método [[DefineOwnProperty]] interno de F con argumentos "prototipo", Descriptor de propiedad {[[Valor]]: proto, {[[Escribir]]: verdadero, [[Enumerable]] : falso, [[Configurable]]: falso} y falso.

+0

Gracias. Esa fue exactamente la respuesta que estaba buscando. – MForster

+1

¡OMG! Me sumerjo en la especificación ECMAScript de vez en cuando, pero esto es difícil de leer. ¿Conoces un recurso que explica todo en él paso a paso (o al menos explicando esas partes horribles)? –

+2

Tristemente no. Es una pena que no haya una buena referencia para ECMAScript como un lenguaje en inglés real, especialmente porque muchas de sus características son ... ser generoso ... un poco peculiar. Tenemos las guías específicas de proveedores como MDC, MSDN y Adobe, tenemos la especificación ECMA casi inutilizable (de alguna manera te acostumbras al lenguaje anterior, pero todavía es muy pesado en el mejor de los casos)), y aparte de eso, está la cuneta de sitios de tutoriales aleatorios que están llenos de errores y consejos terribles. Y esto, para uno de los idiomas más utilizados en el mundo. Es inútil – bobince

Cuestiones relacionadas