0

有没有一种简单的方法可以断言一个对象是代理的目标对象?

const o = {};
const p = new Proxy(o, {});

如本文第 6 页所述,等式运算符似乎不起作用:

o == p; // false
o === p; // false
const q = new Proxy(o, {});
p === q; // false

除了对对象进行字符串化和重新分析之外,有什么方法可以验证它们是否引用了同一个对象?

示例用例:

我想将代理节点与非代理节点进行比较。由于我自己创建了代理,所以我知道预期会发生什么行为。

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
}
4

1 回答 1

1

当您自己创建代理时,您也可以使其具有可比性。例如给出一种识别其目标的方法:

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
}

这种方法还具有非常理想的特性,即nodeList[0] === nodeList[0].

于 2017-05-08T15:21:09.170 回答