Wenn man von JavaScripts Erbritanz spricht, ist es unvermeidlich, dass die Prototypkette nicht getrennt werden kann, sondern die Vererbung nur durch die Prototypkette viele Mängel.
Problem der Vererbung ohne Parameter
Schauen wir uns zunächst einen Beispielcode an, um die B -Vererbung aus a zu implementieren:
Die Codekopie lautet wie folgt:
Funktion a () {
}
A.Prototype.a1 = function () {};
Funktion b () {
}
B.Prototype = new a ();
B.Prototype.b1 = function () {};
var b = neu B ();
alarm (b.constructor == a); // WAHR
Alert (b.Constructor == b); // FALSCH
Die Hauptprobleme mit diesem Code sind:
1. A muss als Prototyp von B instanziiert werden, und der Konstruktor von A wird zu diesem Zeitpunkt ausgeführt. Nach objektorientierten Regeln sollten B und seine übergeordnete Klasse A jedoch nicht vor dem Instanziieren von B. ausgeführt werden
2. veränderte den Prototyp von B und führte zu b.constructor nicht b, sondern A.
Es gibt ein Problem mit der Erbschaft der Ginseng -Klasse
Angenommen, A und B haben zwei Stringparameter S1 und S2. A berechnet die Gesamtlänge der beiden Zeichenfolgen, und B fordert A direkt mit S1 und S2 als Parameter auf:
Die Codekopie lautet wie folgt:
Funktion A (S1, S2) {
this.totallength = S1.Length + S2.Length;
}
A.Prototype.a1 = function () {
};
Funktion B (S1, S2) {
}
B.Prototype = new a ();
B.Prototype.b1 = function () {
};
neu B ("AB", "123");
Wie Sie sehen können, gibt es in diesem Code keine Möglichkeit, S1 und S2 an A zu übergeben. Da es keine Parameter gibt, wenn A als Prototyp von B instanziiert, tritt eine Ausnahme auf:
Die Codekopie lautet wie folgt:
S1 ist undefiniert
Lösung
Der Umfang von S1 und S2 ist nur in B., um sie an a zu übergeben.
Die Codekopie lautet wie folgt:
Funktion B (S1, S2) {
A. anwenden (dies, Argumente);
alarm (this.totallength);
}
Die nächste Frage ist, wie Sie Methode A zum Prototyp B hinzufügen. Dies ist nicht schwierig. Es ist zu beachten, dass für Methoden mit demselben Namen Unterklassen natürlich bevorzugt (überlastet) werden, sodass sie nicht außer Kraft gesetzt werden können:
Die Codekopie lautet wie folgt:
für (var m in a.prototype) {
if (! B.Prototype [m]) {// Methoden der übergeordneten Klasse können Unterklassen nicht überschreiben
B.Prototyp [m] = A.Prototyp [m];
}
}
PostScript
In Anbetracht der Tatsache, dass Sprachen auf hohem Niveau wie C# und Java das mehrfache Erbe aufgegeben haben, wird in diesem Artikel die Situation der einzigen Erbschaft erörtert. Die in diesem Artikel beschriebene Vererbungsmethode wird auch als Erweiterung der JRAISER geschrieben und später veröffentlicht.