【发布时间】:2017-10-11 04:41:06
【问题描述】:
JavaScript Set 似乎与 JavaScript proxies 完全不兼容,试图将 Proxy() Set()
var p = new Proxy(new Set(), {
add(target, val, receiver) {
console.log('in add: ', target, val, receiver)
}
})
p.add(55)
导致 VMError:
Uncaught TypeError: Method Set.prototype.add called on incompatible receiver [object Object]
at Proxy.add (native)
at <anonymous>:1:3
事实上,代理Set() 绝对会破坏它——即使我们的代理处理程序根本不做任何事情!比较 p = new Proxy({}, {}) 与 p = new Proxy(new Set(), {})。 (这适用于 Firefox (52.0.2) 和 Chromium (57.0.2987.133)。)
我似乎找不到可靠的参考或文档,为什么 JavaScript Proxy 不能 Set 对象,为什么它会遇到 VM 错误?
【问题讨论】:
-
代理中没有
add陷阱。看起来您正在寻找子类,而不是代理(它不是Set并且不能与 Set 方法一起使用) -
@Bergi 你在哪里看到这个答案? Map 的答案不适用于 Set,也没有解释为什么空处理程序会破坏 Set 代理。至于缺乏陷阱:这是否记录在任何地方?为什么空陷阱
{}会导致 Set Proxy 出现 VMErrors? -
不,我不是在寻找子类,请在下次将其关闭之前阅读问题...
-
解释确实适用,
Maps 和Sets 工作方式相同。实际上,它确实看起来您正在寻找拦截add方法调用,子类是最简单的解决方案。 -
我被问到 2 个问题,这些问题在我的问题中明确说明(在链接到“重复”问题的链接中都没有回答):
Proxy与Set不兼容?为什么即使在 empty handler 上也会导致 VMError?在我的问题中没有问“我如何拦截添加调用”。
标签: javascript proxy