Ist es möglich, die Basismethode von einer Prototypmethode in JavaScript aufzurufen, wenn sie überschrieben wurde?
MyClass = function(name){
this.name = name;
this.do = function() {
//do somthing
}
};
MyClass.prototype.do = function() {
if (this.name === 'something') {
//do something new
} else {
//CALL BASE METHOD
}
};
javascript
prototype
overriding
markvpc
quelle
quelle
Antworten:
Ich habe nicht verstanden, was genau Sie versuchen, aber normalerweise erfolgt die Implementierung objektspezifischen Verhaltens in dieser Richtung:
quelle
Eine Möglichkeit wäre, die Basismethode zu speichern und sie dann wie folgt über die Overriden-Methode aufzurufen
quelle
_do_base
speichert einen Verweis auf die zuvor definierte Funktion. Wenn es keine gäbe, wäre es soundefined
. JavaScript ist nicht -make
Ausdrücke werden niemals träge ausgewertet, wie Sie es vorschlagen. Wenn der Prototyp, von dem geerbt wird, auch _do_base verwendet, um zu speichern, was seiner Meinung nach die Implementierung seines Basistyps istdo
, dann haben Sie ein Problem. Ja, ein Abschluss wäre eine bessere, vererbungssichere Möglichkeit, den Verweis auf die ursprüngliche Funktionsimplementierung zu speichern, wenn diese Methode verwendet wird - obwohl dies die Verwendung erfordern würdeFunction.prototype.call(this)
.Ich fürchte, Ihr Beispiel funktioniert nicht so, wie Sie denken. Dieser Teil:
überschreibt die Definition von
Da das neu erstellte Objekt bereits eine "do" -Eigenschaft hat, wird die prototypische Kette nicht nachgeschlagen.
Die klassische Form der Vererbung in Javascript ist unangenehm und schwer zu verstehen. Ich würde vorschlagen, stattdessen Douglas Crockfords einfaches Vererbungsmuster zu verwenden. So was:
Meiner Meinung nach eine viel klarere Art, mit Objekten, Konstruktoren und Vererbung in Javascript umzugehen. Sie können mehr in Crockfords Javascript lesen : Die guten Teile .
quelle
base_do
als Funktion aufrufen , weil Sie auf diese Weise jeglichethis
Bindung in der ursprünglichendo
Methode verlieren . Das Setup der Basismethode ist daher etwas komplexer, insbesondere wenn Sie sie mit dem Basisobjektthis
anstelle des untergeordneten Objekts aufrufen möchten . Ich würde etwas Ähnliches vorschlagenbase_do.apply(me, arguments)
.var
fürbase_do
? Ist das absichtlich und wenn ja, warum? Und, wie @GiulioPiancastelli sagte, bricht diese Unterbrechung diethis
Bindung innerhalbbase_do()
oder erbt dieser Aufruf dasthis
von seinem Anrufer?var
sollte da sein. Mitcall
(oderapply
) können wirthis
richtig binden .Ich weiß, dass dieser Beitrag von vor 4 Jahren stammt, aber aufgrund meines C # -Hintergrunds suchte ich nach einer Möglichkeit, die Basisklasse aufzurufen, ohne den Klassennamen angeben zu müssen, sondern ihn über eine Eigenschaft in der Unterklasse abzurufen. Meine einzige Änderung an Christophs Antwort wäre also
Davon:
Dazu:
quelle
this.constructor
möglicherweise nicht immer daraufMyClass
.wenn Sie eine solche Funktion definieren (mit OOP)
Es gibt zwei Möglichkeiten, eine Prototypfunktion aufzurufen: 1) Erstellen Sie eine Instanz und rufen Sie die Objektfunktion auf:
und der andere Weg ist ... 2) ruft die Funktion direkt vom Prototyp auf:
quelle
Diese Lösung verwendet
Object.getPrototypeOf
TestA
ist super das hatgetName
TestB
ist ein Kind, das überschreibt,getName
aber auchgetBothNames
diesuper
Version vongetName
sowie diechild
Version aufruftquelle
quelle
Eine Alternative :
quelle
__proto__
(die den Prototyp eines Objekts ändert) vermieden werden sollte. Bitte benutzen SieObject.create(...)
stattdessen die Route.Wenn ich das richtig verstehe, möchten Sie, dass die Basisfunktionalität immer ausgeführt wird, während ein Teil davon den Implementierungen überlassen bleiben sollte.
Möglicherweise hilft Ihnen das Entwurfsmuster " Vorlagenmethode ".
quelle
Wenn Sie Ihre Superklasse beim Namen kennen, können Sie Folgendes tun:
Dies wird gedruckt
wie erwartet.
quelle
Eine andere Möglichkeit mit ES5 besteht darin, die Prototypenkette mit explizit zu durchlaufen
Object.getPrototypeOf(this)
quelle
Nein, Sie müssten der Funktion do im Konstruktor und der Funktion do im Prototyp unterschiedliche Namen geben.
quelle
Wenn Sie außerdem alle Instanzen und nicht nur diese eine spezielle Instanz überschreiben möchten , kann diese hilfreich sein.
Ergebnis:
quelle
quelle