Javascript 当对象中存在异步操作时,检测/代理对象构造后的更改';s工厂/建造商
如果使用代理捕获对对象的更改,那么如何捕获构造函数/工厂中异步发生的更改 编辑:我无法修改类/工厂以配合观察,但我可以修改Javascript 当对象中存在异步操作时,检测/代理对象构造后的更改';s工厂/建造商,javascript,Javascript,如果使用代理捕获对对象的更改,那么如何捕获构造函数/工厂中异步发生的更改 编辑:我无法修改类/工厂以配合观察,但我可以修改观察功能 const observe=(target)=>新代理({ 设置(目标、propKey、值){ if(目标[propKey]==值){ 返回; } 目标[propKey]=值; console.log('updated') }, }) 当使用以下命令时,它不会捕获异步更改 class Foo { bar = 'initial' constructor()
观察
功能
const observe=(target)=>新代理({
设置(目标、propKey、值){
if(目标[propKey]==值){
返回;
}
目标[propKey]=值;
console.log('updated')
},
})
当使用以下命令时,它不会捕获异步更改
class Foo {
bar = 'initial'
constructor() {
setTimeout(() => this.bar = 'updated', 1000)
}
}
observe(new Foo())
同样地
function createFoo() {
const state = {
bar: 'initial'
}
setTimeout(() => state.bar = 'updated', 1000)
return state
}
observe(createFoo())
我意识到代理是一个新对象,而工厂/构造函数的目标是原始对象。结果,我成功地用getter/setter修补了原始对象上的所有属性,拦截了对当前对象实例的更改。当然,如果不轮询对象以添加属性,则添加到对象的新属性将无法工作
是否有基于代理的解决方案,或者getter/setters+轮询是唯一的选项?如果您可以更改
observe
的签名,则可以通过将代理作为this
注入,从而搞乱Foo
构造函数。但不适用于工厂。这里的能手/二传手似乎最有希望。合理的代码不应该在之后添加新属性。你想要什么吗?@Yousaf我很确定OP不能修改类/工厂来与observation@Bergi,忽略工厂-我如何调整observe
的签名以用代理替换this
?@DavidAlsh我正在考虑Reflect.construct
为this
值(即createObserved(Foo,[…args])
)注入一个自定义对象,但无论如何都不能正常工作(或者不如class Foo extensed Observable{}
can那样好)。您仍然可以做的是Foo.prototype=newproxy(Foo.prototype,…);
观察新属性的赋值,但它越来越难看。如果你可以更改观察
的签名,你可以通过将代理注入this
来搞乱Foo
构造函数。但是,这对工厂不起作用。getter/setter在这里似乎最有前途。合理的代码不应该添加n不管怎样,ew属性。你想要什么吗?@Yousaf我很确定OP不能修改类/工厂来与observation@Bergi,忽略工厂-我将如何调整observe
的签名以用代理替换此
?@DavidAlsh我正在考虑Reflect.construct
,以为这个
值(即createObserved(Foo,[…args])
)创建一个自定义对象,但不管它是否正常工作(或者不如class Foo extensed observeable{}
所能做的那样好)。您仍然可以做的是Foo.prototype=newproxy(Foo.prototype,…)
观察新属性的分配,但它变得越来越丑陋。