多个代理对象对同一个目标的明显污染

我试图为JavaScript中的同一目标对象创build多个代理包装器,每个包装器具有稍微不同的属性,这些属性影响包装的function的操作。 这些属性分配给setreceiver对象并getget处理程序。 但是,当我检查生成的代理时,它们都具有我希望分配给最后创build的代理的属性集。

 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({}, ...)创build我的对象,我得到预期的结果 – 代理one和代理two ,大概是因为目标引用不在它们之间共享。 那么,究竟是什么? 根据我的理解,使用receiver存储name应该防止它传播到目标对象,但似乎无论如何这样做。

你的片段

 Object.defineProperty(receiver, prop, { value: val, configurable: true, enumerable: true} ); 

不会做你期望的事情。 由于这里的receiver是代理对象,属性定义也将被代理到target ,这意味着你的if / else中的分支之间的区别几乎没有。 如果你想为每个代理对象存储一个唯一的名字,在这种情况下最容易做的就是使用闭包的作用域,例如

 const proxies = ['one', 'two'].map(name => { console.log(`proxy ${name}`); const proxy = new Proxy(obj, { get: (target, prop, receiver) => { if (prop === 'name') { return name; } return Reflect.get(target, prop, receiver); }, set: (target, prop, val, receiver) => { if (prop === 'name') { name = val; return true; } return Reflect.set(target, prop, val, receiver); }, ownKeys: (target) => { return Reflect.ownKeys(target).concat('name'); }, getOwnPropertyDescriptor: (target, prop) => { if (prop === "name") return { enumerable: true, writable: true, configurable: true, value: name }; return Reflect.getOwnPropertyDescriptor(target, prop); }, }); return proxy; }); 

直接在代理上设置属性时,似乎发生这种情况。 该行为与实例化多个代理无关; 创build一个单一的代理服务器,并设置其name也污染了目标。

使用一个inheritance对象,其原型设置为代理(详见本答案的相关问题)不会污染代理的目标。

Interesting Posts