Prototypische Vererbung in JavaScript

8

Ich habe mir Douglas Crockfords Gespräche im YUI Theater angeschaut und ich habe eine Frage zur JavaScript-Vererbung ...

Douglas gibt dieses Beispiel, um zu zeigen, dass "Hoozit" von "Gizmo" erbt:

%Vor%

Warum schreibt er Hoozit.prototype = new Gizmo() anstelle von Hoozit.prototype = Gizmo.prototype ?

Gibt es einen Unterschied zwischen diesen beiden?

    
Pablo Fernandez 23.12.2008, 16:45
quelle

4 Antworten

17

Der Grund dafür ist, dass die Verwendung von Hoozit.prototype = Gizmo.prototype bedeuten würde, dass das Modifizieren von Hoozits Prototypobjekt auch Objekte vom Typ Gizmo verändern würde, was kein erwartetes Verhalten ist.

Hoozit.prototype = new Gizmo() erbt von Gizmo und lässt dann Gizmo in Ruhe.

    
Triptych 23.12.2008, 16:48
quelle
3

Die anderen Antworten adressieren das, aber wenn du den Prototyp vererben willst, kannst du parasitäre Magie benutzen:

%Vor%

Jetzt können Sie ersetzen:

%Vor%

mit

%Vor%

Es ist vielleicht nicht die Mühe wert, es sei denn, Sie haben einen wirklich großen Gizmo-Konstruktor (der einzige Gewinn in meinem Vorschlag ist, dass Sie Gizmos Konstruktor nicht anrufen müssen, um den Prototyp anzuschließen). Ich habe Beispiele für viele dieser Arten von Mustern in TDD-JavaScript-Beispielen .

    
Rob 29.10.2009 14:09
quelle
2

Wenn er Hoozit.prototype = Gizmo.prototype schreibt, wird jede Modifizierung, die er später zum Prototyp von Hoozit macht, im Prototyp von Gizmo widergespiegelt.

    
Vasil 23.12.2008 16:49
quelle
2

Zusätzlich zu Triptychs Antwort: Hoozit-Instanzen erben auch alle Exemplareigenschaften von Gizmo, nicht nur die im Prototyp definierten; zB:

%Vor%     
Christoph 23.12.2008 17:08
quelle