Muszę wyśmiać wywołanie funkcji w JavaScript. Do tego mam „oszczędność” funkcja w zmiennej tymczasowej, zaktualizuj cel z nowego bloku funkcyjnego, nazywając cel, a następnie przywracając starą funkcję:Zastępuje i przywraca funkcję
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);
to działa zgodnie z oczekiwaniami: funkcja zostanie nadpisana, a następnie pomyślnie przywrócona. Moja myśl była, aby przenieść ten kod do funkcji pomocniczych i łatwo go używać, gdy są potrzebne:
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);
Kod ten jednak nie zapisać aktualny stan ani nie jest zastąpienie funkcji docelowej. Czego tu mi brakuje? Czy funkcja nie jest zawsze przekazywana jako odniesienie? Jakie są główne różnice między tymi dwoma fragmentami kodu?
(JSFiddle dostępne, ale przygotowania do 8 alert
s ...)
Edycja: użytkownik kolega zauważył, że druga metoda nie bardzo różnią się od pierwszej, a to chyba nie warta tworzenia dodatkowej klasy; a ja nie rozumiem i zgadzam się z ich argumentami, widzę dwie zalety w drugiej metody (oba dotyczą mojego szczególności, sprawa w świecie rzeczywistym):
- łatwiej/szybciej pisać
swapp.Restore();
niżmyNameSpace.level2.level3.level4.level5 = swap;
podczas pracy z obiektami z kilkoma poziomami elementów potomnych i, - , abstrahuje operację, zapewniając spójne wykorzystanie wśród zespołu programistów (dodatkowo, rejestrowanie lub sprawdzanie typu może być wykonane wewnątrz klasy).
Ah, ty mnie pokonać przez 15 sekund, widocznie z niemal identycznym odpowiedź! – mGuv