Ich habe eine Funktion, a()
die ich überschreiben möchte, aber auch das Original a()
in einer Reihenfolge ausführen lassen soll, die vom Kontext abhängt. Zum Beispiel möchte ich manchmal beim Generieren einer Seite Folgendes überschreiben:
function a() {
new_code();
original_a();
}
und manchmal so:
function a() {
original_a();
other_new_code();
}
Wie bekomme ich das original_a()
aus dem Overriding heraus a()
? Ist es überhaupt möglich?
Bitte schlagen Sie auf diese Weise keine Alternativen zum Überfahren vor, ich kenne viele. Ich frage speziell nach diesem Weg.
(functi..
und})
. Nur dies}();
würde das gleiche Ergebnis liefern, da der(function{})()
erste Satz von Klammern verwendet wird, da Sie nicht einfach einen anonymen Funktionsausdruck deklarieren können, den Sie ihm zuweisen müssen. Mit doing () definieren Sie jedoch nichts, was nur eine Funktion zurückgibt.a
, sie nicht aufrufen und den Rückgabewert speichern. Die Klammern lassen mich wissen, dass noch etwas los ist.Das Proxy-Muster könnte Ihnen helfen:
quelle
Vielen Dank, das Proxy-Muster hat wirklich geholfen. Eigentlich wollte ich eine globale Funktion foo aufrufen. Auf bestimmten Seiten muss ich einige Überprüfungen durchführen. Also habe ich folgendes gemacht.
Danke, das hat mir wirklich geholfen
quelle
org_foo(args)
Rufen Sie stattdessen auforg_foo.call(this, args)
. Dasthis
bleibt so , wie es gewesen wäre, wenn window.foo normal aufgerufen hätte (nicht als Proxy). Siehe diese AntwortSie können eine Funktion mit einem Konstrukt wie dem folgenden überschreiben:
Beispielsweise:
Bearbeiten: Tippfehler behoben.
quelle
Übergabe beliebiger Argumente:
quelle
original_a
?Die Antwort von @Matthew Crumley besteht darin, die sofort aufgerufenen Funktionsausdrücke zu verwenden, um die ältere 'a'-Funktion im Ausführungskontext der zurückgegebenen Funktion zu schließen. Ich denke, dies war die beste Antwort, aber ich persönlich würde es vorziehen, die Funktion 'a' als Argument an IIFE zu übergeben. Ich finde es verständlicher.
quelle
Die obigen Beispiele gelten nicht richtig
this
oder werden nichtarguments
korrekt an die Funktionsüberschreibung übergeben. Unterstrich _.wrap () umschließt vorhandene Funktionen, wendet sie anthis
und wirdarguments
korrekt übergeben. Siehe: http://underscorejs.org/#wrapquelle
Ich hatte einen Code von jemand anderem geschrieben und wollte einer Funktion eine Zeile hinzufügen, die ich im Code nicht finden konnte. Als Workaround wollte ich es überschreiben.
Keine der Lösungen hat bei mir funktioniert.
Folgendes hat in meinem Fall funktioniert:
quelle
Ich habe einen kleinen Helfer für ein ähnliches Szenario erstellt, da ich häufig Funktionen aus mehreren Bibliotheken überschreiben musste. Dieser Helfer akzeptiert einen "Namespace" (den Funktionscontainer), den Funktionsnamen und die überschreibende Funktion. Die ursprüngliche Funktion im angegebenen Namespace wird durch die neue ersetzt.
Die neue Funktion akzeptiert die ursprüngliche Funktion als erstes Argument und die ursprünglichen Funktionsargumente als Rest. Der Kontext wird jedes Mal beibehalten. Es unterstützt auch leere und nicht leere Funktionen.
Verwendung zum Beispiel mit Bootstrap:
Ich habe jedoch keine Leistungstests erstellt. Es kann möglicherweise zu unerwünschtem Overhead kommen, der je nach Szenario eine große Sache sein kann oder nicht.
quelle
Meiner Meinung nach sind die Top-Antworten nicht lesbar / wartbar, und die anderen Antworten binden den Kontext nicht richtig. Hier ist eine lesbare Lösung mit ES6-Syntax, um diese beiden Probleme zu lösen.
quelle
Meine Antwort war also eine Lösung, mit der ich die Variable _this verwenden kann, die auf das ursprüngliche Objekt zeigt. Ich habe eine neue Instanz eines "Quadrats" erstellt, aber ich hasste es, wie das "Quadrat" seine Größe erzeugt hat. Ich dachte, es sollte meinen spezifischen Bedürfnissen entsprechen. Zu diesem Zweck benötigte das Quadrat jedoch eine aktualisierte "GetSize" -Funktion mit den Interna dieser Funktion, die andere bereits im Quadrat vorhandene Funktionen wie this.height, this.GetVolume () aufruft. Aber dazu musste ich dies ohne verrückte Hacks tun. Hier ist meine Lösung.
Einige andere Objektinitialisierer- oder Hilfsfunktionen.
Funktion im anderen Objekt.
quelle
Wir sind uns nicht sicher, ob es unter allen Umständen funktioniert, aber in unserem Fall haben wir versucht, die
describe
Funktion in Jest zu überschreiben, damit wir den Namen analysieren und den gesamtendescribe
Block überspringen können , wenn er einige Kriterien erfüllt.Folgendes hat bei uns funktioniert:
Zwei Dinge, die hier entscheidend sind:
Wir verwenden keine Pfeilfunktion
() =>
.Pfeilfunktionen ändern den Verweis auf
this
und wir brauchen das, um die Datei zu seinthis
.Die Verwendung von
this.describe
undthis.describe.skip
anstelle von nurdescribe
unddescribe.skip
.Auch hier sind wir uns nicht sicher, ob es für irgendjemanden von Wert ist, aber wir haben ursprünglich versucht, mit Matthew Crumleys hervorragender Antwort davonzukommen, mussten aber unsere Methode zu einer Funktion machen und Parameter akzeptieren, um sie in der Bedingung zu analysieren.
quelle