gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 15:15:52 24 4
gpt4 key购买 nike

我试图在 JavaScript 中为同一个目标对象创建多个代理包装器,每个包装器的属性略有不同,这些属性会影响包装功能的运行方式。这些属性被分配给 setget 处理程序中的 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 和代理 两个,大概是因为它们之间不共享目标引用。那么:究竟是什么?根据我的理解,使用 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;
});

关于javascript - 同一目标的多个代理对象的明显污染,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44469447/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com