Sfondo rapido: in JavaScript, la funzione di costruzione per ogni tipo di oggetto ha una proprietà prototype
. Il prototype
si riferisce a un oggetto che ogni oggetto costruito utilizza come passo successivo nella sua catena di prototipi. Quando vuoi che un tipo sia inerente ad un altro tipo, puoi impostare prototype
del tipo figlio in una nuova istanza del tipo genitore.
Ad 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 chiede quale codice dovrebbe andare nello spot " Some prototype object goes here
" nel codice sopra. Il mio primo istinto è di costruire un'istanza del genitore (cioè, new Parent()
), ma in un commento ad una risposta su È un modo sicuro di copiare un prototipo di un oggetto in un altro? , un utente scrive:
No, do not use
new bar()
for the prototype object!
(... che è un'opinione che ho visto in molte risposte e commenti SO, ma questo è l'unico esempio che ho in mano al momento.)
L'altra opzione è usare Object.create(Parent.prototype)
come Child.prototype
. Per quanto ne so, questo crea anche una nuova istanza Parent
, ma non esegue il costruttore Parent
.
Qualcuno può spiegare perché l'esecuzione della funzione di costruzione dovrebbe essere evitata quando si genera un prototipo da un tipo genitore? Esiste qualche problema tecnico significativo (forse con più livelli di ereditarietà)? O è un tale modello un uso improprio dei costruttori che si scontra con alcune best practice prototipiche (ad esempio, l'esecuzione del costruttore quando si crea un prototipo viola una separazione delle preoccupazioni)?