Wenn es um die Vererbung von Javascript-Klassen geht, muss diese untrennbar mit der Prototypenkette verbunden sein, aber die Vererbung, die nur über die Prototypenkette implementiert wird, weist viele Mängel auf.
Probleme mit der parameterlosen Klassenvererbung
Sehen wir uns zunächst einen Beispielcode an, um B zu implementieren, der von A erbt:
Funktion B() {
}
B.prototype = new A();
B.prototype.b1 = function() { };
var b = new B();
Alert(b.constructor == A); // true
Alert(b.constructor == B); // false
1. A muss als Prototyp von B instanziiert werden. Zu diesem Zeitpunkt wird der Konstruktor von A ausgeführt. Gemäß den objektorientierten Regeln sollten jedoch vor der Instanziierung von B die Konstruktoren von B und seiner übergeordneten Klasse A nicht ausgeführt werden.
2. Der Prototyp von B wurde geändert, sodass b.constructor nicht B, sondern A ist.
Es liegt ein Problem mit der Parameterklassenvererbung vor
Angenommen, sowohl A als auch B haben zwei String-Parameter s1 und s2. A berechnet die Gesamtlänge der beiden Strings direkt mit s1 und s2 als Parametern:
Funktion B(s1, s2) {
}
B.prototype = new A();
B.prototype.b1 = function() {
};
neues B("ab", "123");
Der Gültigkeitsbereich von s1 und s2 liegt nur in B. Wenn Sie sie nach A übertragen möchten, können Sie nur in B operieren. Dies kann mit Hilfe der Apply-Methode der Funktion erreicht werden:
Angesichts der Tatsache, dass Hochsprachen wie C# und Java die Mehrfachvererbung aufgegeben haben, wird in diesem Artikel nur die Einzelvererbung behandelt. Die in diesem Artikel beschriebene Vererbungsmethode wird auch als Erweiterung von jRaiser geschrieben und später veröffentlicht.