ereditarietà prototipale in JavaScript
-
23-08-2019 - |
Domanda
Sono stato a guardare i colloqui di Douglas Crockford a YUI Teatro, e ho una domanda circa l'eredità JavaScript ...
Douglas dà questo esempio per dimostrare che "Hoozit" eredita da "Gizmo":
function Hoozit(id) {
this.id = id;
}
Hoozit.prototype = new Gizmo();
Hoozit.prototype.test = function (id) {
return this.id === id;
};
Perché ha scrivere Hoozit.prototype = new Gizmo()
invece di Hoozit.prototype = Gizmo.prototype
?
C'è qualche differenza tra questi due?
Soluzione
La ragione è che l'utilizzo Hoozit.prototype = Gizmo.prototype
significherebbe che modifica prototipo oggetto di Hoozit sarebbe anche modificare oggetti di tipo Gizmo, che non è il comportamento.
Hoozit.prototype = new Gizmo()
eredita da Gizmo, e poi se ne va da solo Gizmo.
Altri suggerimenti
Le altre risposte risolvere questo problema, ma se si vuole ereditare il prototipo, è possibile utilizzare una certa magia parassitaria:
Object.prototype.inherit = function(p) {
NewObj = function(){};
NewObj.prototype = p;
return new NewObj();
};
// Paraphrasing of Nicholas Zakas's Prototype Inheritance helper
function inheritPrototype(subType, superType) {
var prototype = Object.inherit(superType.prototype);
prototype.constructor = subType;
subType.prototype = prototype;
};
Ora è possibile sostituire il:
Hoozit.prototype = new Gizmo();
con
inheritPrototype(Hoozit, Gizmo);
Potrebbe non essere vale la pena a meno che non si dispone di un vero e proprio costruttore di grande Gizmo (l'unica vittoria in mio suggerimento è che non c'è bisogno di chiamare il costruttore di Gizmo per collegare il prototipo). Ho esempi di molti di questi tipi di modelli in Esempi TDD JavaScript .
Se egli scrive Hoozit.prototype = Gizmo.prototype qualsiasi modifica che fa seguito al prototipo di Hoozit si rifletterà nel prototipo di Gizmo.
In aggiunta alla risposta del Trittico: casi Hoozit anche erediterà tutte le proprietà di Gizmo esempio, non solo quelli definiti nel prototipo; ad esempio:
function Gizmo() {
this.foo = 'bar'; // foo is visible in every Hoozit instance
}