我遵循的是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/

10-14 18:28