Sfondo rapido: in JavaScript, la funzione di costruzione per ciascun tipo di oggetto ha una prototypeproprietà. Si prototyperiferisce 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 prototypetipo 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 herepunto " " 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 Parentistanza, ma non esegue il Parentcostruttore.
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.createviene implementato.