我想使用ES6代理来捕获以下常用代码:
from Scene_tag where Tag_id = T.id
但在审核proxy documentation后,我不知道该怎么做,主要是因为for (let key in trapped) {
if (!Object.prototype.hasOwnProperty.call(obj, key)) continue;
let value = trapped[key];
//various code
}
陷阱陷阱适用于has
运算符,但似乎不是在上面的代码中使用,in
操作没有陷阱。
答案 0 :(得分:8)
您可以使用getOwnPropertyDescriptor
handler来捕获hasOwnProperty()
来电。
示例:
const p = new Proxy({}, {
getOwnPropertyDescriptor(target, property) {
if (property === 'a') {
return {configurable: true, enumerable: true};
}
}
});
const hasOwn = Object.prototype.hasOwnProperty;
console.log(hasOwn.call(p, 'a'));
console.log(hasOwn.call(p, 'b'));
这是指定的行为,而不是特定实现的怪癖:
Object.prototype.hasOwnProperty
调用抽象[[HasOwnProperty]]
操作[[HasOwnProperty]]
调用抽象[[GetOwnProperty]]
操作[[GetOwnProperty]]
是getOwnPropertyDescriptor
handles 答案 1 :(得分:1)
我实际上是要自己回答我的问题,但是我太慢了,其他人首先回答了这个问题(此外还添加了非常有用的信息)。然而,这是我想写的答案,以防它可能以某种方式帮助某人:
调用getOwnPropertyDescriptor
时似乎会触发hasOwnProperty
陷阱。因此,您可以通过执行以下操作来捕获hasOwnProperty
:
getOwnPropertyDescriptor(target, name) {
return {
value : target[name],
//use a logical set of descriptors:
enumerable : true,
configurable : true,
writable : true
};
}
另一部分也在诱捕get
和ownKeys
:
get(target, name) {
return {}; //replace this with a relevant object
}
//These will be iterated over as part of the for loop
ownKeys() {
return ["RelevantProperty1", "RelevantProperty2"];
}
总而言之,因为你必须在捕获ownKeys
时返回一个属性数组,所以使用代理似乎并没有在这个用例中做得更好。我认为,对于大多数情况,以下情况也会起作用并且不那么脆弱:
let obj = {};
let keys = ["a" , "b"];
for (let key of keys) {
obj[key] = {}; //relevant object
}
因此使用代理可能会有点过分。