“在装饰器函数中设置的对象 属性 未按预期持续存在。”
'Object property set inside decorator function doesn't persist as expected.'
我学习使用 JavaScript 才 4 个月,所以如果有明显的遗漏,请告诉我。
这道题,我写了2个函数,
- 一个是内部(非关键)功函数。它只是添加了 2 个数字。
- 第二个是装饰函数,需要将work函数的参数存储到work本身的函数对象属性中,如work.calls = [ [num1, num2], [etc, etc] ];
- 根据问题的设置,定义后的函数需要这样调用:
work = spy(work);
work(1, 2);
work.calls; // => [1, 2]
我关注了本文 'Custom Properties' 部分 Function Object。所以我希望函数对象 属性 (work.calls) 在我调用 spy(work) 后保留在工作对象中。
当我运行调试器下的代码时,我得到了一个st运行ge结果。
- work.calls定义在spy函数的块内
- work.calls 在工作中变得未定义(1, 2)
我尝试的解决方案如下所示:
function work(num1, num2) {
return num1 + num2;
}
function spy(target) {
target.calls = [];
//set work.calls, work.calls is currently existing in debugger.
function wrap(x, y) {
target.calls.push([x, y]);
return target(x, y);
};
return wrap
}
work = spy(work);
work(1, 2);
work.calls; // => now undefined in the debugger!
我发现的另一个解决方案建议将 target.calls 更改为 wrap.calls,它解决了问题。那么这是否意味着函数对象属性不是持久的,除非从它们自己的体内创建?
function spy(target) {
function wrap(x, y) {
wrap.calls.push([x, y]);
//using wrap instead of target allows work.calls to be persistent
return target(x, y);
};
wrap.calls = [];
return wrap
}
work = spy(work);
work(1, 2);
work.calls; // => [1, 2] all good in work.calls... but why?
我不明白为什么设置 wrap.calls 允许 属性 持续存在。对象不是总是在全局范围内持久化吗?
非常感谢您的耐心等待。我只是希望有人能帮助我理解这一点。
我建议首先避免 work = spy(work);
。而是写
const spiedWork = 间谍(工作);
…
然后比较调用work(1,2)
和调用spiedWork(1,2)
时发生的情况。还要比较 spiedWork.calls
和 work.calls
。一旦你弄清楚了这个(和那个spiedWork !== work
),你就会明白原始代码中发生了什么。
我学习使用 JavaScript 才 4 个月,所以如果有明显的遗漏,请告诉我。
这道题,我写了2个函数,
- 一个是内部(非关键)功函数。它只是添加了 2 个数字。
- 第二个是装饰函数,需要将work函数的参数存储到work本身的函数对象属性中,如work.calls = [ [num1, num2], [etc, etc] ];
- 根据问题的设置,定义后的函数需要这样调用:
work = spy(work);
work(1, 2);
work.calls; // => [1, 2]
我关注了本文 'Custom Properties' 部分 Function Object。所以我希望函数对象 属性 (work.calls) 在我调用 spy(work) 后保留在工作对象中。
当我运行调试器下的代码时,我得到了一个st运行ge结果。
- work.calls定义在spy函数的块内
- work.calls 在工作中变得未定义(1, 2)
我尝试的解决方案如下所示:
function work(num1, num2) {
return num1 + num2;
}
function spy(target) {
target.calls = [];
//set work.calls, work.calls is currently existing in debugger.
function wrap(x, y) {
target.calls.push([x, y]);
return target(x, y);
};
return wrap
}
work = spy(work);
work(1, 2);
work.calls; // => now undefined in the debugger!
我发现的另一个解决方案建议将 target.calls 更改为 wrap.calls,它解决了问题。那么这是否意味着函数对象属性不是持久的,除非从它们自己的体内创建?
function spy(target) {
function wrap(x, y) {
wrap.calls.push([x, y]);
//using wrap instead of target allows work.calls to be persistent
return target(x, y);
};
wrap.calls = [];
return wrap
}
work = spy(work);
work(1, 2);
work.calls; // => [1, 2] all good in work.calls... but why?
我不明白为什么设置 wrap.calls 允许 属性 持续存在。对象不是总是在全局范围内持久化吗?
非常感谢您的耐心等待。我只是希望有人能帮助我理解这一点。
我建议首先避免 work = spy(work);
。而是写
const spiedWork = 间谍(工作); …
然后比较调用work(1,2)
和调用spiedWork(1,2)
时发生的情况。还要比较 spiedWork.calls
和 work.calls
。一旦你弄清楚了这个(和那个spiedWork !== work
),你就会明白原始代码中发生了什么。