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,…)
观察新属性的分配,但它变得越来越丑陋。