2012-02-26 9 views
5

Sembra che ci sia una differenza qui ...[[Prototipo]] vs prototipo: .. qual è la differenza? (MyCons .__ proto__ === MyCons.prototype) è uguale a FALSE

Diciamo che abbiamo function MyConstructor() {}

di MyConstructor [[Prototype]] è Function.prototype, nonMyConstructor.prototype.

In altre (non standard/"console.log-abili") parole:
MyConstructor.__ proto__non è di MyConstructor MyConstructor.prototype

provate questo:

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

Perché è così? Qualcuno può spiegarmi la differenza ?

+0

Vedere anche: ['__proto__' vs.' prototipo' in JavaScript] (http://stackoverflow.com/q/9959727/1048572), [Come funziona JavaScript .prototype?] (Http: // stackoverflow.com/q/572897/1048572) e [Come fa '.__ proto__' differiscono da' .constructor.prototype'?] (http://stackoverflow.com/q/650764/1048572) – Bergi

risposta

9

Pensa a questo. MyConstructor è un oggetto funzione, quindi è stato creato da Function; pertanto il suo [[Prototype]] (o __proto__) è identico allo Function.prototype.

Allo stesso modo, var myObj = new MyConstructor() crea un oggetto myObj con un [[Prototype]] identico a MyConstructor.prototype.

Per dirla in altro modo, le funzioni hanno una proprietà prototype, e quando si richiama funzioni con new, essi costruire un oggetto avendo un [[Prototype]] identica alla struttura della funzione di costruzione prototype ... comunque proprietà di una funzione prototype non è stessa cosa della sua proprietà [[Prototype]] (o __proto__), perché una funzione segue le stesse regole degli altri oggetti e ottiene la sua proprietà interna [[Prototype]] dalla funzione che lo ha costruito (che è sempre Function, incidentalmente).


Per spiegare ulteriormente, [[Prototype]] e prototype hanno scopi completamente diversi. [[Prototype]] viene utilizzato quando si risolvono le proprietà di un oggetto. Se un oggetto non ha una proprietà, il suo [[Prototype]] è spuntato e quindi quello dell'oggetto [[Prototype]], e così via, fino a quando non viene trovata una proprietà o si raggiunge la fine della catena del prototipo.

Al contrario, prototype è il meccanismo con cui si assegnano le proprietà [[Prototype]] agli oggetti, poiché non è possibile accedervi direttamente oltre alla proprietà non standard __proto__.

Poiché le funzioni sono oggetti, hanno sia una proprietà [[Prototype]] interna, utilizzato per risolvere le proprietà come oggetti normali, e una proprietà prototype, che viene assegnato come [[Prototype]] di nuovi oggetti costruiti dalla funzione.

0

questo codice vederlo molto chiaro:

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__);

console cromata di che è:

enter image description here

il significato di quella:

A. nel "prototipo" di JavaScript è un oggetto speciale che esiste solo nelle funzioni - per creare un costruttore di funzioni (per la tua domanda - ecco perché "prototipo" non è uguale a "proto").

B. la matrice e le funzioni hanno il loro valore 'proto' con tutte le loro proprietà e metodi incorporati in JavaScript.

C. tutto in JavaScript veramente dentro sono oggetti, quindi il 'prototipo. proto 'di funzioni, o' proto. proto 'di funzioni e matrici sono tutti uguali a' proto 'di un oggetto.

Problemi correlati