Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ecmascript 6 ES2015代理:断言代理与目标对象相同_Ecmascript 6_Es6 Proxy - Fatal编程技术网

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
}