JavaScriptで同じターゲットオブジェクトに対して複数のプロキシラッパーを作成しようとしていますが、ラップされた機能がどのように動作するかに影響するわずかなプロパティがあります。これらのプロパティは、set
およびget
ハンドラのreceiver
オブジェクトに割り当てられ、アクセスされます。しかし、生成されたプロキシを調べると、それらのプロキシはすべて、の最後にプロキシが割り当てられていると予想されるプロパティセットを持っています。同じターゲットの複数のプロキシオブジェクトによる混乱
const obj = {};
const proxies = ['one', 'two'].map(name => {
console.log(`proxy ${name}`);
const proxy = new Proxy(obj, {
get: (target, prop, receiver) => {
if (prop === 'name') { return receiver.name; }
return target[prop];
},
set: (target, prop, val, receiver) => {
if (prop === 'name') {
console.log(`setting name ${val} on receiver`);
Object.defineProperty(receiver, prop, {
value: val,
configurable: true,
enumerable: true}
);
} else {
console.log(`setting ${prop} ${val} on target`);
target[prop] = val;
}
return true;
}
});
proxy.name = name;
return proxy;
});
console.log();
console.log(proxies);
私の期待する結果:[{name: 'one'}, {name: 'two'}]
実際の結果:[{name: 'two'}, {name: 'two'}]
同じに見えても、ではなく、と厳密に同じです。
私はconst obj
を省略し、new Proxy({}, ...)
と私のオブジェクトを作成する場合は、私が期待した結果を得る - 目標基準は、それらの間で共有されていないと思われることから、プロキシone
およびプロキシtwo
を。だから地球上の何ですか?私の理解から、name
を格納するためにreceiver
を使用すると、それがターゲットオブジェクトに伝播するのを防ぐべきですが、とにかくそうしているようです。
正確に値が格納されることを期待していますが、「受信者」とは何を期待していますか?ヒント:プロキシ自体に何も格納することはできません。 – Bergi