对间谍对象的非法调用

时间:2015-03-01 16:40:02

标签: javascript

我正在尝试创建一个Spy对象,该对象将监视另一个对象上的方法被调用的次数。我可以通过将目标的方法包装在Spy中来实现监视工作,但是当我尝试调用目标的方法时,出现Illegal invocation错误,我不确定原因。

function Spy(target, method) {
    var counter = 0;
    var oldFunc = target[method];
    target[method] = function(args){
        return (function(){
            counter++;
            oldFunc(args); //ILLEGAL
        })();
    }
    return { count : counter }
}
var spy = Spy(console, 'error');
console.error('foo', 'bar');
console.error('foobar');
console.log(spy.count);

http://jsfiddle.net/s505eemb/

1 个答案:

答案 0 :(得分:1)

函数调用的主要问题是:

  • 你没有传递所有论据
  • 您没有传递预期的this
  • 您没有返回结果值

使用apply method解决此问题。 顺便说一句,IEFE没用,你没有更新.count属性,只更新本地counter变量。

function Spy(target, method) {
    var counter = 0;
    var oldFunc = target[method];
    target[method] = function() {
        counter++;
        return oldFunc.apply(this, arguments);
    };
    return { get count() { return counter; } }
}

updated demo