关于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
相关产品推荐
相关产品推荐

