JavaScript-Vererbung: wenn Konstruktor Argumente hat
Mit reinen JavaScript-Vererbung zu tun, das ist was ich normalerweise tun:
function A() {}
A.prototype.run = function () {};
function B() {}
B.prototype = new A;
B.prototype.constructor = B;
Da keine Argumente übergeben werden, die in den Konstruktor, der Eine neue hat nichts zu meckern. Nun, ich habe nicht herausgefunden, eine gute Möglichkeit, das zu tun erbschaft, wenn der Konstruktor hat Argumente übergeben werden. Zum Beispiel,
function A(x, y) {}
A.prototype.run = function () {};
function B(x, y) {}
B.prototype = new A;
B.prototype.constructor = B;
Konnte ich einige beliebige Werte wie:
B.prototype = new A(null, null);
In einigen Fällen, ich kann bestätigen müssen x und y im Konstruktor von A. In einigen extremen Fällen, ich brauche werfen Fehler beim ankreuzen x oder y ist. Dann gibt es keine Möglichkeit für B zum Erben über neue A.
Irgendwelche Vorschläge?
Dank!
InformationsquelleAutor der Frage Grace Shao | 2011-09-23
Du musst angemeldet sein, um einen Kommentar abzugeben.
Gut, wenn Sie wollen
B.prototype
ein Objekt erbt vonA.prototype
ohne Ausführung derA
Konstruktor, um zu vermeiden, alle möglichen Nebenwirkungen, könnte man eine dummy-Konstruktor, um es zu tun, zum Beispiel:Könnte man eine Funktion erstellen, die Kapselung der Logik der Schöpfung dieses neue Objekt, z.B.:
Wenn Sie das Ziel moderner Browser, den Sie verwenden konnten, die in ECMAScript 5
Object.create
Methode für den gleichen Zweck, wie z.B.:InformationsquelleAutor der Antwort CMS
Das problem ist, dass Sie können nicht erstellen Sie einfach ein Prototyp-Objekt für
B
seit Aufruf des Konstruktors derA
kann nicht durchgeführt werden. Dies ist aufgrund der Parameter für den Konstruktor wird unbekannt vornew B
ausgeführt wird. Müssen Sie eine dummy-Konstruktor-Funktion zum erstellen eines Prototypen fürB
dass links zuA
's Prototyp.Einmal hast du das Prototyp-Objekt für
B
einrichten, müssen Sie sicherstellen, rufen Sie den Konstruktor derA
im Konstruktor vonB
.Sollten Sie nun in der Lage sein zu instanziieren
B
durch den Aufrufnew B(x, y)
.Für eine komplette derselben einschließlich der überprüfung der parameter in
A
siehe ein jsFiddle.In Ihrem ursprünglichen code werden Sie durch
B.prototype.constructor = B
. Ich bin nicht immer, warum Sie dies tun. Dieconstructor
Eigenschaft hat keinen Einfluss auf die Vererbung, Hierarchie, für die dieprototype
Eigenschaft verantwortlich ist. Wenn Sie wollen, um die benannten Konstruktor enthalten, in dieconstructor
Eigenschaft, die Sie brauchen, um erweitern Sie den code von oben ein wenig:Verwendung der ersten definition von
B.prototype
man die folgenden Ergebnisse:Mit der extended version erhalten Sie:
Die Ursache für die unterschiedliche Leistung ist, die
instanceof
folgt, bis die gesamte Prototyp-Kette vonb
und versucht, Sie zu finden Sie einen passenden Prototyp-Objekt fürA.prototype
oderB.prototype
(in den anderen anrufen). Dieb.constructor
Prototyp verweist auf die Funktion, die verwendet wurde, um zu definieren, die Instanzen der Prototyp. Im Fall Sie sich Wundern, warum es nicht aufprotoCreator
dieses ist, weil sein Vorbild war überschrieben mitA.prototype
bei der Erstellung vonB.prototype
. Der erweiterten definition, wie Sie im das aktualisierte Beispiel behebt diesesconstructor
Eigenschaft auf einen besser geeigneten (weil wahrscheinlich mehr erwartet) - Funktion.Für den täglichen Gebrauch, würde ich empfehlen, Sie zu verwerfen, die Idee mit dem
constructor
Eigenschaft von Instanzen vollständig. Stattdessen verwendeninstanceof
da Ihre Ergebnisse sind besser vorhersagbar/erwartet.InformationsquelleAutor der Antwort Augustus Kling
Bedenken Sie:
Dann
Nun
b
erbt von einer Instanz vonA
erbt, die wiederum vonA.prototype
.Live-demo: http://jsfiddle.net/BfFkU/
Object.create
nicht implementiert im IE8, aber man kann sich leicht manuell implementieren:Diese können platziert werden
ie8.js
- Datei, die geladen wird, nur für den IE8 und unten mittels conditional comments.InformationsquelleAutor der Antwort Šime Vidas
Dies ist zwar ein altes Thema, ich dachte, ich würde Antworten sowieso.
Zwei Möglichkeiten, es zu tun:
Obwohl die Pseudo-Klassik Weg ist das beliebteste, es hat seine Schattenseiten, da es braucht, um den parent-Konstruktor einmal in der Kind-Konstruktor und einmal, während Erben der Prototyp. Außerdem das Kind Prototyp enthält alle Eigenschaften des übergeordneten Konstruktors, die eh überschrieben wird, wenn das Kind Konstruktor aufgerufen wird. Meine persönliche Wahl ist Prototypal Inheritance.
1. Pseudo-Klassische Vererbung:
2. Prototypal Inheritance:
InformationsquelleAutor der Antwort A K