2013-10-30 188 views
0

我试图为对象中的每个函数添加一个钩子,下面是我的代码,它运行良好。在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”],这是函数名称。

我该如何解决这个问题?提前致谢。

+0

见http://stackoverflow.com/questions/3120017/javascript-forwarding-function-calls-that-take-variable-number-of-arguments – Kos

+0

@Kos可能不完全一样 –

回答

1

您可以实施自己的bind。简易版:

if (!Function.prototype.bind) { 
    Function.prototype.bind = function(that) { 
     var fn = this; 
     return function() { 
      fn.apply(that, arguments); 
     } 
    }; 
} 

或正确的版本:

if (!Function.prototype.bind) { 
    Function.prototype.bind = function (oThis) { 
    if (typeof this !== "function") { 
     // closest thing possible to the ECMAScript 5 internal IsCallable function 
     throw new TypeError("Function.prototype.bind - what is trying to be bound is not callable"); 
    } 

    var aArgs = Array.prototype.slice.call(arguments, 1), 
     fToBind = this, 
     fNOP = function() {}, 
     fBound = function() { 
      return fToBind.apply(this instanceof fNOP && oThis 
           ? this 
           : oThis, 
           aArgs.concat(Array.prototype.slice.call(arguments))); 
     }; 

    fNOP.prototype = this.prototype; 
    fBound.prototype = new fNOP(); 

    return fBound; 
    }; 
} 

代码摘自:

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/bind

+0

很酷。有兴趣编写自己的绑定。非常感谢。 –

0

你应该做这样的事情

newInstance[funcName] = (function(){ 
     console.log(arguments); 
     return function(){ 
      foo.beforeMethodHook(); 
      foo[funcName].apply(foo,arguments); 
     } 
    })(funcName); 
+0

不工作。所有的方法都会被定义的最后一个方法覆盖,在这种情况下是“test2”。 “test1”不再存在.. –

相关问题