【发布时间】:2016-03-27 16:41:56
【问题描述】:
Javascript 的新代理功能为调试提供了一些有趣的功能。例如,您可以通过将对象放在带有get 处理程序的代理后面来“保护”一个对象,如果您访问未定义的属性,该处理程序将抛出。这有助于发现拼写错误和其他类型的错误。
可以这样使用:
class Something {
constructor()
{
this.foo = "bar";
allObjects.push(this);
}
};
function defend(o)
{
return new Proxy(o, DebugCheckHandler);
};
let rawSomething = new Something();
let defendedSomething = defend(rawSomething);
可以认真编写代码以仅处理defendedSomething。然而在这个例子中,Something 构造函数将this 传递到其他地方(到allObjects)。这最终与在代码库中同时使用 rawSomething 和 defendedSomething 具有相同的效果。
问题源于代理引用不等于其原始引用,因为rawSomething !== defendedSomething。例如,如果allObjects.includes(defendedSomething) 包含rawSomething,它将返回false,因为includes 会执行严格的=== 检查。
有没有什么好的方法可以不用对代码做太多改动来解决这个问题?
【问题讨论】:
-
在构造函数中使用全局变量(或任何外部变量)是非常糟糕的工程,
allObjects.push(this);应该在外部,例如allObjects.push(rawSomething);
标签: javascript ecmascript-6 proxies