我有以下代码是使用代理类设置器。在我的例子中,我跟踪特定的变量来更新其他变量。My Setter正在将所有更改的日志写入Console。然而,如果我试图从setter本身修改一个变量,变量会被修改,但Proxy不会被调用。是否通过设计来避免循环?还是我错过了什么?
class darthVader {
constructor() {
return new Proxy(this, {
set(obj, prop, value) {
console.log(`Setting ${prop} to ${value}`)
obj[prop] = value
return true
}
})
}
set resistance(val) {
this._resistance= val
this.darkSide = false
}
get resistance() { return this._R2D2 }
}
let newHero = new darthVader()
newHero.resistance = 11
console.log(newHero.darkSide)
2条答案
按热度按时间cngwdvgl1#
问题是您的陷阱只运行
obj[prop] = value
,它在目标obj
上设置了一个属性,而不是在代理上。您应该使用Reflect.set
method,它为set trap提供了默认实现,并需要一个可选的receiver
参数。这个接收者是setter将被评估的对象,您应该传递receiver
argument of theset
trap(它将引用您分配给resistance
的newHero
代理)。ctrmrzij2#
set
方法中的obj
引用了执行return new Proxy(this
时的this
,该对象 * 不是 * 代理,而是darthVader
示例本身-正在由darthVader
构造函数创建的示例。因此,当您分配给obj
的属性时,您直接将属性放在darthVader
示例上,而不是放在代理示例(即newHero
)上。因此,不会调用代理方法。如果你想递归地调用代理,你可以在从构造函数返回它之前定义它(比如说,作为变量名
proxy
),然后在set
方法中引用proxy
,但是考虑到当前的逻辑,这会导致堆栈溢出,因为你会不断地调用代理的setter: