2012-05-30 15 views
9

Soy muy nuevo en JavaScript. Estoy leyendo buenas partes de JavaScript. Dice:¿Por qué el prototipo de funciones está encadenado repetidamente?

Cada objeto función también se crea con un prototipo propiedad

así que hice algo como esto:

function test() { 
} 

console.log(test.prototype); 

El uso de herramientas para desarrolladores de Chrome, encuentro la salida de la siguiente manera:

enter image description here

Estoy realmente confundido con esta salida. ¿Por qué la propiedad constructor de prototype volvió a anidar con constructor? ¿Y por qué sucede esto como una cadena ? Donde me estoy perdiendo el concepto?

Gracias de antemano.

Respuesta

9

La propiedad prototype de una función contiene el objeto desde el que heredarán todas las instancias de esa función cuando se cree con el operador new. Y todos estos objetos prototipo (por lo general) tienen una propiedad constructor que apunta a la función, allí tiene la referencia circular. Entonces, como new test() hereda esa propiedad, (new test).constructor === test evalúa a true.

Tendrá que distinguir entre la propiedad prototype de un objeto de función y el objeto prototipo del que hereda un objeto, a menudo denominado "la propiedad interna [[prototype]]".

Un constructor es una función, por no decir un Function, y tiene ambos. Por lo tanto, hereda del objeto Function.prototype, donde la propiedad constructor dice que todas las funciones están construidas por el constructor Function. Si su consola de desarrolladores muestra el prototipo de los objetos Function, puede verlos. Creo que hay una opción en la configuración.

Así, la famosa "cadena de prototipo" no se trata de la constructor y/o prototype propiedades, sino sobre el objeto prototipo de la que ese objeto hereda de:

function test() {}    new test() 
    (a Function)    (a test instance) 
     ||       || 
     ||       || 
     \/       \/ 
Function.prototype   test.prototype 
(a Function, by spec)   (an Object) 
     ||       || 
     ||       || 
     \/       \/ 
Object.prototype    Object.prototype 
     ||       || 
     ||       || 
     \/       \/ 
     null       null 
+0

Gracias por el enlace, ya me pregunté sobre la salida al comprobar rápidamente 'Object.getPrototypeOf (test)' en la consola ... – Bergi

+0

Buena respuesta ... Muchas cosas para sacar de su respuesta :) –

+0

@ Bergi- Por favor explique: "Un constructor es una función, por no decir una Función, y tiene ambas. Por lo tanto, hereda del objeto Function.prototype" – jason

2

Eso es uno de los muy buenos libros para recoger.

Cubre más de javascript desde el punto de vista de los programadores que cubre todas las técnicas orientadas a objetos y la mayoría de las cosas en él no están cubiertas en ningún otro libro en javascript.

Y sobre el prototipo. Cada objeto en JavaScript contiene una pieza oculta de estado: una referencia a otro objeto conocido como prototipo del objeto. Los objetos prototipo en JavaScript nos dan herencia, y nos permiten compartir implementaciones de métodos también. Los prototipos también encadenan En otras palabras, dado que un objeto prototipo es solo un objeto, entonces un objeto prototipo puede mantener una referencia a otro objeto prototipo.

El prototipo en Javascript es una parte poco complicada ya que lo he experimentado mientras lo aprendía.

Este es un gran reference para saber cómo funciona el prototipo en js.

+0

Esa referencia fue increíble, gracias. – keyser

+0

Gracias por el +1 :) – Katti

Cuestiones relacionadas