You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

关于JavaScript装饰器spy中work.calls属性可访问性的疑问

问题解答

核心原因很简单:JavaScript里的函数本质上是对象,你可以像给普通对象添加属性一样,给函数加自定义属性。

拿任务里的解决方案逻辑举个直观例子:

function spy(func) {
  function wrapper(...args) {
    // 记录当前调用的参数
    wrapper.calls.push(args);
    return func.apply(this, args);
  }
  // 给wrapper函数初始化calls属性
  wrapper.calls = [];
  return wrapper;
}

// 原work函数示例
function work(a, b) {
  return a + b;
}

// 让work变量指向spy返回的wrapper函数
work = spy(work);

当执行work = spy(work)时,work这个变量现在存储的就是spy函数返回的wrapper函数对象。而wrapper本身已经被添加了calls属性,所以通过work.calls访问,本质就是在访问这个wrapper函数对象上的calls属性——和你给普通对象obj加obj.name,再用变量x = obj,然后通过x.name访问是同一个逻辑。

说白了:现在的work就是那个带calls属性的wrapper函数,自然能直接访问它的属性。

内容的提问来源于stack exchange,提问作者Rustam Tau

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 02:18:10