2012-02-26 10 views
5

Parece que hay una diferencia aquí ...[[Prototype]] vs prototype: ..what es la diferencia? (MyCons .__ proto__ === MyCons.prototype) es igual a FALSO

Digamos que tenemos function MyConstructor() {}

de MyConstructor [[Prototype]] es Function.prototype, noMyConstructor.prototype.

En otras (/ "console.log-capaces" no estándar) palabras :
MyConstructor.__ proto__no es de MyConstructor MyConstructor.prototype

Prueba esto:

function MyConstructor() {}; 
(MyConstructor.__proto__ === MyConstructor.prototype); //false?! why? 

¿Por qué es esto así? ¿Alguien me puede explicar la diferencia ?

+0

Vea también: ['__proto__' contra' prototype' en JavaScript] (http://stackoverflow.com/q/9959727/1048572), [¿Cómo funciona JavaScript '.prototype'?] (Http: // stackoverflow.com/q/572897/1048572) y [¿En qué se diferencia '.__ proto__' de' .constructor.prototype'?] (http://stackoverflow.com/q/650764/1048572) – Bergi

Respuesta

9

Piénsalo así. MyConstructor es un objeto de función, por lo que fue creado por Function; por lo tanto, su [[Prototype]] (o __proto__) es idéntico a Function.prototype.

De la misma manera, var myObj = new MyConstructor() crea un objeto myObj con un [[Prototype]] idéntico a MyConstructor.prototype.

Para decirlo de otra manera, las funciones tienen una propiedad prototype, y cuando se invoca funciones con new, van a construir un objeto que tiene una [[Prototype]] idéntica a la propiedad de la función constructora prototype ... sin embargo la propiedad de una función prototype no es Lo mismo que su propiedad [[Prototype]] (o __proto__), porque una función sigue las mismas reglas que otros objetos y obtiene su propiedad interna [[Prototype]] de la función que la construyó (que es siempre Function, por cierto).


Para explicar con más detalle, y [[Prototype]]prototype tienen propósitos completamente diferentes. [[Prototype]] se usa cuando se resuelven las propiedades de un objeto. Si un objeto no tiene una propiedad, se comprueba su [[Prototype]], y luego ese objeto es [[Prototype]], y así sucesivamente, hasta que se encuentre una propiedad o llegue al final de la cadena del prototipo.

Por el contrario, prototype es el mecanismo mediante el cual se asigna [[Prototype]] propiedades de los objetos, ya que no puede acceder directamente a ellos sí que con la __proto__ propiedad no estándar.

Dado que las funciones son objetos, que tienen tanto una propiedad [[Prototype]] interna, que se utiliza para resolver propiedades como con objetos normales, y una prototype propiedad, que se asigna como el [[Prototype]] de nuevos objetos construidos por la función.

0

este código se mostrará muy claro:

var obj = {}; 
 
var arr = []; 
 
var fun = function() {};  
 

 
A:  
 
console.log(obj.prototype); 
 
console.log(arr.prototype); 
 
console.log(fun.prototype); 
 

 
B: 
 
console.log(arr.__proto__); 
 
console.log(fun.__proto__); 
 

 
C: 
 
console.log(obj.__proto__); 
 
console.log(arr.__proto__.__proto__); 
 
console.log(fun.__proto__.__proto__); 
 
console.log(fun.prototype.__proto__);

la consola de cromo de eso es:

enter image description here

el significado de que:

A. en JavaScript 'prototipo' es un objeto especial que existe solo en funciones - para hacer el constructor de función (para su pregunta - por eso 'prototipo' no es igual a 'proto').

B. array y funciones tienen su propio 'proto' con todas sus propiedades y métodos incorporados en JavaScript.

C. todo en JavaScript verdaderamente dentro de ellos son objetos, por lo que el 'prototipo. proto 'de funciones, o' proto. proto 'de funciones y matrices son todas iguales al' proto 'de un objeto.

Cuestiones relacionadas