Ecmascript 6 ES2015代理:断言代理与目标对象相同
有没有一种简单的方法可以断言对象是代理的目标对象Ecmascript 6 ES2015代理:断言代理与目标对象相同,ecmascript-6,es6-proxy,Ecmascript 6,Es6 Proxy,有没有一种简单的方法可以断言对象是代理的目标对象 const o = {}; const p = new Proxy(o, {}); 相等运算符似乎不起作用: 除了对对象进行字符串化和重新划分外,还有什么方法可以验证它们是否引用了相同的对象 示例性用例: 我想比较代理节点和非代理节点。因为我自己创建了代理,所以我知道预期的行为 const nodeList = new Proxy(document.querySelectorAll('div'), { get(target, key) {
const o = {};
const p = new Proxy(o, {});
相等运算符似乎不起作用:
除了对对象进行字符串化和重新划分外,还有什么方法可以验证它们是否引用了相同的对象
示例性用例:
我想比较代理节点和非代理节点。因为我自己创建了代理,所以我知道预期的行为
const nodeList = new Proxy(document.querySelectorAll('div'), {
get(target, key) { return new Proxy(target[key], {}); }
});
const specificNode = document.querySelector('div[data-target]');
for (const node of nodeList) {
if (node === specificNode) { doSomethingElse(); } // Never happens, even if specificNode is in the nodeList
}
当您自己创建代理时,还可以使其具有可比性。例如,给出一种确定其目标的方法:
const associatedTarget = Symbol();
const p = new Proxy(target[key], {});
p[associatedTarget] = target[key];
return p;
…
if (node[associatedTarget] === specificNode)
更好的办法可能是为每个目标提供一个单例代理,这样您就可以获得特定节点的代理,并通过==:
这种方法还有一个非常理想的特性,即nodeList[0]==nodeList[0]。您为什么会在意?如果您不知道代理做什么,它可能会表现得像target,也可能完全不是。@Bergi请参阅上面的示例性用例。为什么不在node.dataset中使用If target…else?当然,创建没有任何陷阱的内部代理是毫无意义的。这只是一个非常简单的例子。现实世界中的用例有代理陷阱,但对于这个问题来说可能太多了。使用weakmap跟踪代理是一个非常好的解决方案,谢谢。
const associatedTarget = Symbol();
const p = new Proxy(target[key], {});
p[associatedTarget] = target[key];
return p;
…
if (node[associatedTarget] === specificNode)
const proxies = new WeakMap();
function makeUniqueProxy(t) {
if (!proxies.has(t))
proxies.set(t, new Proxy(t, {}));
return proxies.get(t);
}
const nodeList = new Proxy(document.querySelectorAll('div'), {
get(target, key) { return makeUniqueProxy(target[key]); }
});
const specificNode = makeUniqueProxy(document.querySelector('div[data-target]'));
// ^^^^^^^^^^^^^^^
for (const node of nodeList) {
if (node === specificNode) { doSomethingElse(); } // just works
}