【发布时间】:2018-04-17 10:47:10
【问题描述】:
请原谅我的无能... 在全局 var 阶段不再未定义后,我正在尝试使用 Proxy 执行一些代码。这是我天真的尝试:
```
var stage = undefined
let myObj;
let st = {
stage: stage,
}
let lr = {
get: function(obj:any, prop:any):LightRay{
myObj = new SomeObjThatNeedsStage(obj[prop]) // <= supposed to be non-undefined stage
return myObj
},
}
let p = new Proxy(st, lr)
// At this point I expect the lr handler to have been executed if the stage var has been instantiated by some external code that's out of my control.
```
显然,我误解了代理的工作原理,但我尝试了各种方案,但都不起作用。将未定义阶段作为目标传递给代理不起作用(出现Cannot create proxy with a non-object as target or handler 错误)。在这种情况下如何使用代理?为什么我不能用Proxyobserve undefined stage 直到实例化,然后再执行回调?
仅供参考:
Stage var 是全局变量,我无法控制它(它有时由 create.js 实例化)。所有代码都从 UMD 模块执行。我正在使用打字稿(转译为 es5)。 Object.defineProperty() 在我的浏览器中可用。此外,stage(createjs.Stage 类型)在实例化时确实包含不同类型的 setter/getter,这在使用 typescript 时会出现问题。
【问题讨论】:
-
这听起来像是X/Y problem。您为什么认为要编写代码来监视全局变量的值是否发生变化?
-
应该定义什么
stage变量? -
仅供参考:观察变化是反模式和代码维护的噩梦。尽可能寻找任何其他解决方案,例如使一个模块依赖于另一个模块,以便在模块运行之前知道它已加载。
-
是的,我知道这是个坏主意,但我不得不处理它,因为 Adobe Animate CC 导出 Create.js 代码的方式很奇怪,而且 Create.js 烦人地没有发出 ('ready ') 事件会告诉我舞台已启动并正在运行。它不在我的控制范围内。
-
"在这种情况下如何使用代理?" - 你不能。
标签: javascript ecmascript-6 es6-proxy