Mi capita di apprendere il prototipo di You Don't Know JS: this & Object Prototypes , che è un libro meraviglioso per comprendere il design sottostante e chiarire così tante idee sbagliate (ecco perché sto cercando di evitare l'uso dell'eredità e cose del genere instanceof
).
Ma ho la stessa domanda delle persone qui poste. Diverse risposte sono davvero utili e illuminanti. Mi piacerebbe anche condividere le mie comprensioni.
Cos'è un prototipo?
Gli oggetti in JavaScript hanno una proprietà interna, indicata nella specifica come [[Prototype]]
, che è semplicemente un riferimento a un altro oggetto. Quasi tutti gli oggetti hanno un null
valore non valido per questa proprietà, al momento della loro creazione.
Come ottenere il prototipo di un oggetto?
tramite __proto__
oObject.getPrototypeOf
var a = { name: "wendi" };
a.__proto__ === Object.prototype // true
Object.getPrototypeOf(a) === Object.prototype // true
function Foo() {};
var b = new Foo();
b.__proto__ === Foo.prototype
b.__proto__.__proto__ === Object.prototype
Qual è il prototype
?
prototype
è un oggetto creato automaticamente come proprietà speciale di una funzione , che viene utilizzato per stabilire la catena di delega (ereditarietà), nota anche come catena di prototipi.
Quando creiamo una funzione a
, prototype
viene automaticamente creata come una proprietà speciale su a
e salva il codice funzione come constructor
on prototype
.
function Foo() {};
Foo.prototype // Object {constructor: function}
Foo.prototype.constructor === Foo // true
Mi piacerebbe considerare questa proprietà come il luogo in cui archiviare le proprietà (compresi i metodi) di un oggetto funzione. Questo è anche il motivo per cui funzioni di utilità in JS sono definiti come Array.prototype.forEach()
, Function.prototype.bind()
,Object.prototype.toString().
Perché enfatizzare la proprietà di una funzione ?
{}.prototype // undefined;
(function(){}).prototype // Object {constructor: function}
// The example above shows object does not have the prototype property.
// But we have Object.prototype, which implies an interesting fact that
typeof Object === "function"
var obj = new Object();
Così, Arary
, Function
, Object
sono tutte le funzioni. Devo ammettere che questo rinfresca la mia impressione su JS. So che le funzioni sono di prima classe in JS, ma sembra che sia basato su funzioni.
Qual è la differenza tra __proto__
e prototype
?
__proto__
un riferimento funziona su ogni oggetto per fare riferimento alla sua [[Prototype]]
proprietà.
prototype
è un oggetto creato automaticamente come proprietà speciale di una funzione , che viene utilizzato per memorizzare le proprietà (compresi i metodi) di un oggetto funzione.
Con questi due, potremmo mappare mentalmente la catena di prototipi. Come questa immagine illustra:
function Foo() {}
var b = new Foo();
b.__proto__ === Foo.prototype // true
Foo.__proto__ === Function.prototype // true
Function.prototype.__proto__ === Object.prototype // true
__proto__
differisceconstructor.prototype
?