Ich habe die letzten paar Stunden damit verbracht, eine Lösung für mein Problem zu finden, aber es scheint hoffnungslos zu sein.
Grundsätzlich muss ich wissen, wie man eine übergeordnete Methode aus einer untergeordneten Klasse aufruft. All das, was ich bisher versucht habe, führt dazu, dass die übergeordnete Methode entweder nicht funktioniert oder überschrieben wird.
Ich verwende den folgenden Code, um OOP in Javascript einzurichten:
// SET UP OOP
// surrogate constructor (empty function)
function surrogateCtor() {}
function extend(base, sub) {
// copy the prototype from the base to setup inheritance
surrogateCtor.prototype = base.prototype;
sub.prototype = new surrogateCtor();
sub.prototype.constructor = sub;
}
// parent class
function ParentObject(name) {
this.name = name;
}
// parent's methods
ParentObject.prototype = {
myMethod: function(arg) {
this.name = arg;
}
}
// child
function ChildObject(name) {
// call the parent's constructor
ParentObject.call(this, name);
this.myMethod = function(arg) {
// HOW DO I CALL THE PARENT METHOD HERE?
// do stuff
}
}
// setup the prototype chain
extend(ParentObject, ChildObject);
Ich muss zuerst die Methode des Elternteils aufrufen und dann in der untergeordneten Klasse weitere Dinge hinzufügen.
In den meisten OOP-Sprachen wäre das so einfach wie das Aufrufen. parent.myMethod()
Aber ich kann wirklich nicht verstehen, wie es in Javascript gemacht wird.
Jede Hilfe wird sehr geschätzt, danke!
quelle
ParentClass.prototype.myMethod.apply() or
ParentClass.prototype.myMethod.call () `ausführen, wie Sie es mit Ihrem Konstruktor tun.ParentClass.prototype.myMethod.call(this, arg1, arg2, arg3...);
myMethod
in Ihrer Klasse haben.Mit dem ES6-Stil können Sie neue Funktionen wie das
super
Schlüsselwort verwenden.super
Bei der Verwendung der ES6-Klassensyntax dreht sich alles um den Kontext der übergeordneten Klasse. Als sehr einfaches Beispiel: Kasse:Sie können auch
super
den übergeordneten Konstruktor aufrufen:Und natürlich können Sie damit auf übergeordnete Klasseneigenschaften zugreifen
super.prop
. Verwenden Sie also ES6 und seien Sie glücklich.quelle
super
aufgerufen werden? Gibt es eine Äquivalenz in "alten" JS?super()
in statischen Methoden verwenden; Sieht so aus, als hätten Sie es im Konstruktor verwendet.Um dies zu tun, sind Sie nicht auf die
Class
Abstraktion von ES6 beschränkt. Der Zugriff auf die Prototypmethoden des übergeordneten Konstruktors ist über die__proto__
Eigenschaft möglich (ich bin mir ziemlich sicher, dass es andere JS-Codierer geben wird, die sich darüber beschweren, dass sie abgeschrieben ist), die abgeschrieben wird, aber gleichzeitig festgestellt hat, dass sie tatsächlich ein wesentliches Werkzeug für die Unterklassifizierung von Anforderungen ist ( speziell für die Anforderungen der Array-Unterklassifizierung). Während die__proto__
Eigenschaft noch in allen wichtigen JS-Engines verfügbar ist, die ich kenne, hat ES6 dieObject.getPrototypeOf()
Funktionalität darüber hinaus eingeführt. Dassuper()
Werkzeug in derClass
Abstraktion ist ein syntaktischer Zucker davon.Falls Sie also keinen Zugriff auf den Namen des übergeordneten Konstruktors haben und die
Class
Abstraktion nicht verwenden möchten, können Sie dennoch Folgendes tun:quelle
Bei mehreren Vererbungsstufen kann diese Funktion in anderen Sprachen als super () -Methode verwendet werden. Hier ist eine Demo-Geige , mit einigen Tests können Sie sie wie folgt in Ihrer Methode verwenden:
call_base(this, 'method_name', arguments);
Es nutzt die neuesten ES-Funktionen, eine Kompatibilität mit älteren Browsern ist nicht garantiert. Getestet in IE11, FF29, CH35.
quelle
Wie wäre es mit etwas, das auf der Idee von Douglas Crockford basiert:
quelle
Hier ist eine gute Möglichkeit für untergeordnete Objekte, mithilfe der Prototypkette von JavaScript auf übergeordnete Eigenschaften und Methoden zuzugreifen, und sie ist mit Internet Explorer kompatibel. JavaScript durchsucht die Prototypenkette nach Methoden und wir möchten, dass die Prototypenkette des Kindes folgendermaßen aussieht:
Untergeordnete Instanz -> Untergeordneter Prototyp (mit untergeordneten Methoden) -> Übergeordneter Prototyp (mit übergeordneten Methoden) -> Objektprototyp -> null
Die untergeordneten Methoden können auch schattierte übergeordnete Methoden aufrufen, wie in den drei Sternchen *** unten gezeigt.
Hier ist wie:
quelle
Es gibt eine viel einfachere und kompaktere Lösung für die Suche nach mehrstufigen Prototypen, die jedoch
Proxy
Unterstützung erfordert . Verwendung:SUPER(<instance>).<method>(<args>)
Zum Beispiel unter der Annahme von zwei KlassenA
undB extends A
mit der Methodem
:SUPER(new B).m()
.quelle
Während Sie die übergeordnete Methode , mit dem Prototyp des Mutter aufrufen können, müssen Sie die aktuelle untergeordnete Instanz für die Verwendung zu übergeben
call
,apply
oderbind
Verfahren. Diebind
Methode erstellt eine neue Funktion, daher empfehle ich dies nicht, wenn Sie sich für die Leistung interessieren, es sei denn, sie wird nur einmal aufgerufen.Alternativ können Sie die untergeordnete Methode ersetzen und die übergeordnete Methode in die Instanz einfügen, während Sie die ursprüngliche untergeordnete Methode aufrufen.
quelle