我試圖爲對象中的每個函數添加一個鉤子,下面是我的代碼,它運行良好。在JavaScript中使用()()將參數傳遞給匿名函數
function foo(){}
foo.beforeMethodHook = function(){console.log('Hook was called.');}
foo.getInstance = function(){
var newInstance = new foo;
var funcNames = Object.getOwnPropertyNames(foo);
for(i in funcNames){
var funcName = funcNames[i];
if(funcName == 'getInstance' || funcName == 'beforeMethodHook' || Object.hasOwnProperty(funcName)) continue;
newInstance[funcName] = function(){
foo.beforeMethodHook();
return foo[this].apply(foo,arguments);
}.bind(funcName);
}
return newInstance;
}
foo.test1 = function(arg1){console.log('test1 was called. arg1 = ' + arg1);return true;}
foo.test2 = function(arg1,arg2){console.log('test2 was called. arg1 = ' + arg1 + ' , arg2 = ' + arg2);return true;}
//Test
var f = foo.getInstance();
f.test1('ahaha');
f.test2('heihei','houhou');
作爲IE10-不支持功能(){}。綁定(),我試圖.bind()改變爲下面
newInstance[funcName] = (function(){
foo.beforeMethodHook();console.log(arguments);
return foo[funcName].apply(foo,arguments);
})(funcName);
(函數(){})()
但問題來了,我失去了參數 f.test1('ahaha')已通過。參數數組只給出[「test1」],這是函數名稱。
我該如何解決這個問題?提前致謝。
見http://stackoverflow.com/questions/3120017/javascript-forwarding-function-calls-that-take-variable-number-of-arguments – Kos
@Kos可能不完全一樣 –