我遵循的是here中的节点功能编程教程,但是当我尝试实现第12课的代码时,如下所示
function Spy(target, method) {
var store={};
var self=this;
var copy=target[method];
store[target[method]]=0;
console.log(store);
console.log(store[target[method]]);
target[method]=function(){
store[target[method]]+=1;
return copy.apply(this,arguments);
};
return {count:store[target[method]]};
}
var spy = Spy(console, 'error');
console.error('calling console.error');
console.error('calling console.error');
console.error('calling console.error');
console.log(spy.count);
我在Spy中得到
console.log(store)
返回一个包含函数的对象。另外,来自Spy的最终返回return {count:store[target[method]]};
未定义。谁能解释这两个背后的原因?谢谢 最佳答案
因为在设置store[target[method]]=0;
之后,您将target[method]
设置为等于一个函数,这会弄乱store[target[method]]
的值并使它不确定。看来您想在copy
上使用您的return
值:
return {count:store[copy]};
尽管在这种情况下
count
仍为0
并没有帮助。这是因为您要直接在Spy
中返回一个对象,因此无法在{prop: value, ...}
函数中真正对其进行修改。尽管要解决这个问题,但将对象Spy
定义为构造函数({count:store[copy]}
)中的变量,然后返回该变量:var returnObj = {count:store[copy]};
。现在您可以在return returnObj
中更新returnObj.count
。之所以可行,是因为JavaScript中的
[target[method]]
是通过引用传递的。function Spy(target, method) {
var store={};
var self=this;
var copy=target[method];
store[target[method]]=0;
var returnObj = {count:store[copy]};
target[method]=function(){
returnObj.count+=1;
return copy.apply(this,arguments);
};
return returnObj;
}
var spy = Spy(console, 'error');
console.error('calling console.error');
console.error('calling console.error');
console.error('calling console.error');
console.log(spy.count);
关于javascript - 对象文字动态键,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32731360/