2017-05-05 4 views
0

オブジェクトがプロキシのターゲットオブジェクトであることを簡単にアサートできる方法はありますか?ES2015プロキシ:プロキシがターゲットオブジェクトと同じであることをアサートする

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

等価演算子は、動作するようには思えませんas outlined in this paper on page 6

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

彼らは同じオブジェクトを参照していることを確認する方法はあります、他のそのオブジェクトを文字列化して再解析?

典型的なユースケース:私は非と、プロキシノードを比較したい

は1をプロキシ。私はプロキシを自分で作成するので、どのような振る舞いが予想されるのか分かります。

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 
} 
+0

なぜ気になりますか?プロキシが何をしているのかわからない場合、 'target'のように振舞うかもしれません。 – Bergi

+0

@Bergi上記の使用例を参照してください。 – nils

+0

なぜ、 'if(" node.datasetのtarget ... else else? "もちろん、トラップのない内部プロキシを作成するのは無意味です。 – Bergi

答えて

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]を持っています。

+0

WeakMapsを使ってプロキシを追跡するのはかなり甘い解決策です、ありがとうございます。 – nils

関連する問題