Heim  >  Artikel  >  Web-Frontend  >  Problemlösungen für die Parameterlose und parametrisierte Klassenvererbung in Javascript_Javascript-Kenntnisse

Problemlösungen für die Parameterlose und parametrisierte Klassenvererbung in Javascript_Javascript-Kenntnisse

WBOY
WBOYOriginal
2016-05-16 16:11:391022Durchsuche

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:

Code kopieren Der Code lautet wie folgt:

Funktion A() {
}
A.prototype.a1 = function() { };

Funktion B() {
}
B.prototype = new A();
B.prototype.b1 = function() { };

var b = new B();
Alert(b.constructor == A); // true
Alert(b.constructor == B); // false


Das Hauptproblem bei diesem Code ist:

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:

Code kopieren Der Code 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() {
};

neues B("ab", "123");


Wie Sie sehen, gibt es in diesem Code keine Möglichkeit, s1 und s2 an A zu übergeben, und da beim Instanziieren von A als Prototyp von B keine Parameter vorhanden sind, tritt eine Ausnahme auf:
Code kopieren Der Code lautet wie folgt:

s1 ist undefiniert

Lösung

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:

Code kopieren Der Code lautet wie folgt:

Funktion B(s1, s2) {
A.apply(this, arguments);
alarm(this.totalLength);
}

Die nächste Frage ist, wie man die Methode von A zum Prototyp von B hinzufügt. Dies ist nicht schwierig. Durchqueren Sie einfach A.prototype und kopieren Sie die Methode nach B.prototype. Zu beachten ist, dass bei gleichnamigen Methoden natürlich Unterklassen Vorrang haben (Überladung) und daher nicht überschrieben werden können:
Code kopieren Der Code lautet wie folgt:

for (var m in A.prototype) {
​if (!B.prototype[m]) { // Die übergeordnete Klasse kann die Methode der Unterklasse nicht überschreiben
​B.prototype[m] = A.prototype[m];
}
}

Postskriptum

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.

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn