2013-12-13 8 views
5

ich mehrere Artikel über js Erbe schon gelesen (this one, this one, this one, etc.)Was ist der korrekte Prototyp Affektation in Javascript Vererbung?

In this article von Mozilla, "klassischen" Vererbung ist als dies gezeigt: (I Beispiele vergleichmäßigt)

// inherit Base 
function Derived() { ... } 
Derived.prototype = new Base();   <------- 
Derived.prototype.constructor = Derived; <------- 

Doch in this article ich sehe:

// inherit Base 
function Derived() { ... } 
Derived.prototype = Object.create(Base.prototype); <------- 
Derived.prototype.constructor = Derived; 

Darüber hinaus habe ich auch gesehen:

Derived.prototype = Base.prototype; 

Und ich experimentierte auch und nicht die Verwendung von constructor Affektiertheit finden konnte:

Derived.prototype.constructor = Derived; <--- it still work if I skip this line 

wenn ich diese Zeile überspringen, new Derived() richtig ruft Derived() sowieso.

So 1) Was ist richtig:

  1. Derived.prototype = new Base();
  2. Derived.prototype = Object.create(Base.prototype);
  3. Derived.prototype = Base.prototype;
  4. andere?

Und 2) wird Derived.prototype.constructor = Derived; wirklich benötigt? Warum ?

+1

das ist die Sache über Javascript, können Sie tun, was Sie mögen .. Ich mag John Resig class.js Weg der Verpackung der Prototyp-Quatsch für Sie, so dass Sie es nie in Ihrem Code sehen müssen .http: //ejohn.org/blog/simple-javascript-inheritance/ – andygoestohollywood

+1

'Object.create()' ist ein relativ neuer Befehl, der vorher nicht existierte. Siehe https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/create (die Browser-Kompatibilitätsübersicht befindet sich am Ende dieser Seite). Wenn Sie nur Browser verwenden, die es haben, verwenden Sie es, sonst nicht - wie ist das für einen lächerlich offensichtlichen Ratschlag? :) –

Antwort

3
Derived.prototype = new Base(); 

die nur Base Konstruktor Dies ruft für die Prototypkette aufzubauen. Während es manchmal funktioniert und äquivalente Ergebnisse zu Object.create gibt, ist es fehleranfällig und sollte vermieden werden. Lesen Sie What is the reason to use the 'new' keyword at Derived.prototype = new Base (und warum sollte nicht verwendet werden).

Derived.prototype = Object.create(Base.prototype); 

Dieser Stand der Technik ist - Correct javascript inheritance so zu sagen.

Derived.prototype = Base.prototype; 

This is plain wrong. Do not use. Es lässt Base und Derived Instanzen erben von gleichen Objekt - während es (selten) hilfreich sein kann, mehrere Konstruktoren für eine "Klasse" zu haben, ist dies nicht "Unterklassenbildung".

Wird Derived.prototype.constructor = Derived; wirklich benötigt? Warum?

Es kann weggelassen werden und Ihr Skript wird trotzdem funktionieren, aber aus praktischen Gründen würden Sie erwarten, dass (new Derived).constructor === Derived. Siehe auch JavaScript inheritance and the constructor property

1

Was ist der richtige Weg, klassische Vererbung in JavaScript zu tun

In this Antwort i die Differenz zwischen 1 erklärt und 2 zeigen, warum 2 ist die beste Art und Weise klassische Vererbung in JavaScript zu emulieren.

Kurz gesagt, in Lösung 1 erben Kinder von einer Instanz des übergeordneten Elements. In Lösung 2 erbt die Klasse der Kinder (Derived.prototype) von der Klasse des Elternteils (Base.prototype). Dies bedeutet für das übergeordnete Element schwerwiegende Einschränkungen, da es mit 0 Argumenten aufgerufen werden muss.

Die dritte Lösung ist noch schlimmer, da die Prototypen der Abgeleiteten und der Basisklasse das gleiche Objekt sind, so dass keine Methode außer Kraft gesetzt werden kann. Schlimmer noch, eine in Derived.prototype definierte Methode wird für alle Base-Instanzen verfügbar sein, und wenn eine Methode mit demselben Namen auf Base.prototype deklariert wäre, würde sie einfach ersetzt werden.

Fazit: 2 ist die wahre Art, klassische Vererbung in JavaScript zu tun.

ist die Einstellung der Eigenschaft constructor

Einstellen der constructor Eigenschaft auf dem Prototyp erforderlich macht es zugänglich für alle Instanzen. Das ist nur der Einfachheit halber, der erbende Teil funktioniert ohne ihn.

+0

Erleuchtung. Würde es Ihnen etwas ausmachen, auch beim zweiten Teil der Frage zu helfen? – Offirmo

+0

Ich bin froh, Ihnen helfen zu können. – Tibos

Verwandte Themen