Frage

Ich sehe eine Menge von Code wie folgt:

function Base() {}
function Sub() {}
Sub.prototype = new Base();

Wenn Sie jedoch tun:

s = new Sub();
print(s.constructor == Sub);

Das ist falsch. Dies scheint verwirrend für mich, da s Konstruktor ist in der Tat, Sub. Ist es üblich / besser, dies zu tun?

function Base() {}
function Sub() {}
Sub.prototype = new Base();
Sub.prototype.constructor = Sub;

oder ist es nicht wirklich eine Rolle?

War es hilfreich?

Lösung

‚Konstruktor‘ nicht tut, was es sieht aus wie es funktioniert. Dies zusätzlich zu seiner nicht-standardness, ein guter Grund, es zu vermeiden, mit -. Stick mit instanceof und Prototyp

Technisch: ‚Konstruktor‘ ist keine Eigenschaft der Instanz ‚s‘, es ist eine Eigenschaft des ‚Sub‘ Prototypobjekts durchscheinen. Wenn Sie die ‚Sub‘ Funktion in Mozilla erstellen, erhalten Sie eine neu geprägten Standard Sub.prototype Objekt, das einen ‚Konstruktor‘ hat, die zurück in die Unterfunktion als Höflichkeit.

Jedoch Sie dann mit einem neuen Basis, den Prototyp ersetzen (). Der ursprüngliche Standard Prototyp mit dem Link zurück zu Sub verloren geht; stattdessen ist Sub.prototype eine Instanz Basis ohne einen zwingenden ‚Konstruktor‘ Eigenschaft. Also:

new Sub().constructor===
Sub.prototype.constructor===
new Base().constructor===
Base.prototype.constructor===
Base

... den ganzen Weg hinunter zu den grundlegendsten Objekt, dessen Prototyp Sie nicht ändern.

  

Ist es üblich / besser, dies zu tun?

Wenn Sie mit Objekten / Klassen JavaScript handelt es gibt niemand Konvention; jede Bibliothek metaclass System verhält sich etwas anders. Ich habe ihn nicht gesehen, die manuell ‚Konstruktor‘ zu jeder abgeleiteten Klasse schreibt, aber es scheint so gut eine Lösung, wie jeder, wenn Sie wirklich den Real-Konstruktor haben wollen; es wird auch der Code kompatibel mit Browsern / Motoren, die Sie ‚Konstruktor‘ nicht geben.

Ich würde es für einen anderen Namen zu geben, aber eine Verwechslung mit dem bestehenden und unterschiedlich verhalten ‚Konstruktor‘ Eigentum zu vermeiden.

Andere Tipps

Wenn Sie möchten, zu prüfen, ob ein Objekt genau eine Instanz von Sub den instanceof Operator verwenden: -

print(s instanceof Sub);

Wenn Sie wissen wollen, ob ein Objekt eine Instanz von Sub oder eine Instanz einer Unterklasse von Sub die isPrototypeOf Methode verwenden: -

print(Sub.prototype.isPrototypeOf(s));

Ja,

Sub.prototype.constructor = Sub;

wir an, Sie instanceof verwenden, aber es gibt eine bessere Lösung. Schau mal hier: TDD JS Vererbung auf GitHub und finden Sie die Parasitäre Kombination Vererbung Muster. Der Code wird TDD'd so sollten Sie in der Lage sein, es grok sehr schnell und dann einfach die Namen ändern Sie den Start. Dies ist im Grunde, was Anwendungen YAHOO.lang.extend (Quelle: Yahoo-Mitarbeiter und Professional JavaScript des Autors Nicholas Zakas für Web-Entwickler, 2. ED, Seite 181). Gutes Buch übrigens (nicht in irgendeiner Weise verbunden!)

Warum? Da das klassische Muster mit dem Sie arbeiten hat staticy Referenz Vars (wenn Sie var arr erstellen = [1,2] im Basisobjekt, haben alle Instanzen lesen / schreiben und wird „share-Zustand“ von ‚arr‘! Wenn Sie verwenden Konstruktor stehlen Sie können dieses Problem umgehen. Meine Beispiele.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top