- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我试图在 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
和代理 两个
,大概是因为它们之间不共享目标引用。那么:究竟是什么?根据我的理解,使用 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/
通常当我请求线程转储时,系统性能不佳的症状很容易解释;也就是说,通常我会看到许多线程显然正在等待一个已被获取但未被另一个释放的监视器。 在这种情况下,我有很多线程在等待监视器 (0x965ad100)
C:\Users\shagy\Desktop\3RD YEAR 2ND SEMESTER\SPM\Newfolder\SPM-SMS>npm start npm ERR! path C:\Users\
我是一名优秀的程序员,十分优秀!