我正在尝试创建一个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);
答案 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; } }
}