我正在尝试为 JavaScript 中的同一目标对象创建多个代理包装器,每个单独的包装器具有稍微不同的属性,这些属性会影响包装功能的运行方式。这些属性分配给和处理程序receiver
中的对象并从其访问。但是,当我检查生成的代理时,它们都具有我期望已分配给最后创建的代理的属性集。set
get
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({}, ...)
我会得到预期的结果——一个 proxyone
和一个 proxy two
,大概是因为目标引用不在它们之间共享。那么:到底是什么?据我了解,使用receiver
to storename
应该可以防止它被传播到目标对象,但它似乎还是这样做了。