Sfondo rapido: in JavaScript, la funzione di costruzione per ciascun tipo di oggetto ha una prototype
proprietà. Si prototype
riferisce a un oggetto che ciascun oggetto costruito utilizza come passaggio successivo nella catena del prototipo. Quando si desidera che un tipo sia inerente a un altro tipo, è possibile impostare il prototype
tipo figlio su una nuova istanza del tipo padre.
Per esempio:
var Parent = function() { /* constructor business */ }
Parent.prototype.parentProp = "some parent property";
var Child = function() { /* constructor business */ }
Child.prototype = /*** !! Some prototype object goes here !! ***/
La mia domanda mi chiede su quale codice dovrebbe andare nel Some prototype object goes here
punto " " nel codice sopra. Il mio primo istinto è quello di costruire un'istanza del genitore (cioè, new Parent()
), ma in un commento a una risposta su È un modo sicuro di copiare un prototipo di oggetti in un altro? , un utente scrive:
No, non utilizzare
new bar()
per l'oggetto prototipo!
(... che è un'opinione che ho visto in molte risposte e commenti SO, ma questo è l'unico esempio che ho a portata di mano al momento.)
L'altra opzione è usare Object.create(Parent.prototype)
come Child.prototype
. Per quanto ne so, questo crea anche una nuova Parent
istanza, ma non esegue il Parent
costruttore.
Qualcuno può spiegare perché eseguire la funzione di costruzione dovrebbe essere evitato quando si genera un oggetto prototipo da un tipo genitore? Esiste qualche problema tecnico significativo (forse con livelli multipli di eredità)? O un tale schema è un uso improprio dei costruttori che si scontra con alcune best practice prototipiche (ad esempio, l'esecuzione del costruttore durante la creazione di un prototipo viola una certa separazione delle preoccupazioni)?
Object.create
viene implementato.