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.
fonte
2012-02-26 09:29:53
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