5

Considerare:Perché le funzioni rispondono a .prototype ma gli oggetti normali no?

function Foo() {} 
var x = new Foo(); 

ora x e Foo hanno lo stesso prototipo, ma solo Foo risponde a .prototype:

Object.getPrototype(x) === Foo.prototype // true 
x.prototype === Foo.prototype // false 

Foo.prototype // Foo {} (depending on which browser) 
x.prototype // undefined 

Perché non x.prototype lavoro, ma Foo.prototype funziona?

+0

'x.constructor.prototype == Foo.prototype' – dandavis

+0

In realtà' x' e 'Foo' non hanno lo stesso prototipo: il prototipo di' Foo' è 'Function.prototype'. Hai delle buone risposte, alcune ricerche sulla "catena dei prototipi javascript" dovrebbero aiutarti. – traktor53

risposta

5

prototype è una proprietà di costruttori che determina quale sarà il prototipo di nuovi oggetti creati da tale costruttore. È utile avere una proprietà di questo tipo su un costruttore.

Finché il prototipo sul costruttore non è stato cambiato:

Object.getPrototypeOf(x) === Foo.prototype 

e che è lo stesso:

Object.getPrototypeOf(x) === x.constructor.prototype 

Nota che in genere:

Object.getPrototypeOf(Foo) != Foo.prototype 
+0

l'ultima riga sembra più utile, in particolare il fatto che 'Foo.protoype' è * NON * il prototipo di Foo, ma il prototipo di oggetti costruiti * con * Foo. Ho ragione? – user2316560

+0

@ user2316560 Sì, sembra giusto. – Paulpro

1

Per farla breve: le funzioni destinate a new hanno prototype, le istanze di oggetto no.

Probabilmente non riuscirò con precisione a dire questo, ma lo prototype è qualcosa che si applica solo a ciò che potreste chiamare funzioni di costruzione, che sono chiamate chiamate con new per creare istanze. Il prototipo può essere pensato come modello per l'istanza risultante.

Per l'oggetto risultante, prototype è non una proprietà. Piuttosto, le proprietà in il prototipo del costruttore sono disponibili come proprietà sull'istanza che è stata creata. Significa che quando si cerca una proprietà sull'istanza, se non è definita sull'istanza, Javascript inizierà a controllare la catena del prototipo per vedere se è definita lì.

Se si desidera accedere al prototipo di un'istanza, utilizzare Object.getPrototypeOf.

La semantica di Javascript può essere fonte di confusione. Consiglio vivamente di utilizzare lo Javascript Allongé libero per leggere come un modo per comprendere a fondo alcuni dei punti migliori di Javascript. Il capitolo 8 si concentra esattamente su questo argomento.