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?

È stato utile?

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
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top