Un'operazione comune in JavaScript è quella di sostituire un metodo oggetto con uno nuovo mentre si chiama ancora il metodo originale. Questo è spesso fatto in questo modo:
var originalMethod = obj.method;
obj.method = function(arg) {
// call original method
originalMethod.call(this, arg);
// do my stuff new stuff
}
Mi piacerebbe creare una funzione di utilità per un metodo oggetto specifico che gestisca la parte concatenata in modo che l'utente non debba preoccuparsi di ciò. Un'opzione consiste nell'usare il disegno sopra, in cui ogni funzione aggiunta è racchiusa in una nuova funzione che chiama quella precedente. Un'altra opzione è creare una serie di funzioni e rendere il metodo object semplicemente iterato sull'array, chiamando a turno ciascuna funzione.
function addXyzMethod1(fn) {
if (obj.method) {
var previousMethod = obj.method;
obj.method = function(value) {
value = previousMethod.call(this, value);
return fn.call(this, value);
};
} else {
obj.method = fn;
}
}
function addXyzMethod2(fn) {
if (obj._methodList) {
obj._methodList.push(fn);
} else if (obj.method) {
obj._methodList = [obj.method, fn];
obj.method = function(value) {
for (var i = 0, n = obj._methodList.length; i < n; i++) {
value = obj._methodList[i].call(this, value);
}
return value;
};
} else {
obj.method = fn;
}
}
A questo punto, non posso decidere quale metodo utilizzare poiché ritengo che i compromessi di ciascuno siano pari. Quindi la mia domanda qui è: quale di questi metodi è migliore (più naturale, accettato o più veloce) o c'è un altro metodo che migliora su entrambi?