Ich muss eine Funktion in JavaScript mock aufrufen. Dafür bin ich „Speichern“ die Funktion in einer temporären Variablen, aktualisieren Sie das Ziel mit einem neuen Funktionsblock, das Ziel aufrufen und dann die Wiederherstellung der alten Funktion:Überschreiben und Wiederherstellen einer Funktion
var myObject = {
myIntProp: 1,
myFunc: function(value) {
alert(value + 1);
}
};
myObject.myFunc(2);
var tmp = myObject.myFunc;
myObject.myFunc = function(value) {
alert(value - 1);
};
myObject.myFunc(2);
myObject.myFunc = tmp;
myObject.myFunc(2);
Dies funktioniert wie erwartet: Die Funktion wird überschrieben und anschließend erfolgreich wiederhergestellt. Mein Gedanke war, diesen Code in eine Hilfsfunktion zu bewegen und es leicht bei Bedarf verwenden:
function FunctionSwapper(target, newFunction) {
var old = target;
target = newFunction;
this.Restore = function() {
target = old;
}
};
var myObject = {
myIntProp: 1,
myFunc: function(value) {
alert(value + 1);
}
};
myObject.myFunc(2);
var swapp = new FunctionSwapper(myObject.myFunc, function(value) {
alert(value - 1);
});
myObject.myFunc(2);
swapp.Restore();
myObject.myFunc(2);
Dieser Code wird jedoch nicht den aktuellen Zustand speichern, noch es die gezielte Funktion zu ersetzen. Was fehlt mir hier? Wird eine Funktion nicht immer als Referenz übergeben? Was sind die Hauptunterschiede zwischen den beiden Code-Snippets?
(JSFiddle zur Verfügung, aber die Vorbereitungen für 8 alert
s ...)
Edit: ein Kerl Benutzer hat darauf hingewiesen, dass das zweite Verfahren nicht wirklich von der ersten unterscheiden und dass es wahrscheinlich nicht der Mühe wert Erstellen der zusätzlichen Klasse; während ich mit ihren Argumenten nicht verstehen und akzeptieren, sehe ich zwei Vorteile bei der zweiten Methode (beide insbesondere, realen Fall meiner Anwendung):
- es ist einfacher/schneller
swapp.Restore();
alsmyNameSpace.level2.level3.level4.level5 = swap;
zu schreiben, wenn Arbeits mit Objekten, die mehrere Ebenen von Kindelementen haben, und - abstrahiert die Operation, die eine konsistente Verwendung innerhalb des Entwicklungsteams bietet (zusätzlich könnte Protokollierung oder Typprüfung innerhalb der Klasse erfolgen).
Ah, schlagen Sie mich nach 15 Sekunden scheinbar mit einer fast identischen Antwort! – mGuv