Devo fingere di chiamare una funzione in JavaScript. Per questo, sto "salvare" la funzione in una variabile temporanea, aggiornare il bersaglio con un nuovo blocco funzionale, chiamando il bersaglio e poi ripristinare la vecchia funzione:Sovrascrivi e ripristina una funzione
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);
questo funziona come previsto: la funzione viene sovrascritta e quindi ripristinata con successo. Il mio pensiero è stato quello di spostare il codice in una funzione di supporto e di usare facilmente quando necessario:
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);
Questo codice tuttavia, non salva lo stato attuale né è sostituendo la funzione mirata. Cosa mi manca qui? Una funzione non è sempre passata come riferimento? Quali sono le principali differenze tra i due frammenti di codice?
(JSFiddle disponibili, ma prepararsi a 8 alert
s ...)
Edit: un utente collega ha fatto notare che il secondo metodo in realtà non differisce dalla prima e che probabilmente non vale la pena di creare la classe aggiuntiva; mentre io capisco e condivido le loro argomentazioni, vedo due vantaggi nel secondo metodo (entrambi si applicano al mio particolare, caso nel mondo reale):
- è più facile/più veloce per scrivere
swapp.Restore();
dimyNameSpace.level2.level3.level4.level5 = swap;
quando si lavora con oggetti che hanno diversi livelli di elementi figlio e, - , astrae l'operazione, fornendo un uso coerente tra il team di sviluppo (in aggiunta, la registrazione o il tipo di correzione può essere fatto all'interno della classe).
Ah, mi hai battuto di 15 secondi, a quanto pare con una risposta quasi identica! – mGuv