使用ES6代理陷阱Object.hasOwnProperty
Use ES6 proxy to trap Object.hasOwnProperty
我想用ES6代理套住以下常用代码:
for (let key in trapped) {
if (!Object.prototype.hasOwnProperty.call(obj, key)) continue;
let value = trapped[key];
//various code
}
但是看了proxy documentation之后,我不知道该怎么做,主要是因为has
trap trap是针对in
操作符的,好像不是在上面的代码中使用并且hasOwnProperty
操作没有陷阱。
您可以使用 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
其实我是要自己回答问题的,但是我太慢了,别人先回答了(还补充了很有用的信息)。不过,这是我想写的答案,以防它能以某种方式帮助某人:
似乎在调用 hasOwnProperty
时触发了 getOwnPropertyDescriptor
陷阱。因此,您可以通过执行以下操作来捕获 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
时必须 return 一组属性,因此在此用例中使用代理似乎并没有使事情变得更好。我认为对于大多数情况,以下方法同样有效并且不那么脆弱:
let obj = {};
let keys = ["a" , "b"];
for (let key of keys) {
obj[key] = {}; //relevant object
}
所以使用代理可能有点矫枉过正。
我想用ES6代理套住以下常用代码:
for (let key in trapped) {
if (!Object.prototype.hasOwnProperty.call(obj, key)) continue;
let value = trapped[key];
//various code
}
但是看了proxy documentation之后,我不知道该怎么做,主要是因为has
trap trap是针对in
操作符的,好像不是在上面的代码中使用并且hasOwnProperty
操作没有陷阱。
您可以使用 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
其实我是要自己回答问题的,但是我太慢了,别人先回答了(还补充了很有用的信息)。不过,这是我想写的答案,以防它能以某种方式帮助某人:
似乎在调用 hasOwnProperty
时触发了 getOwnPropertyDescriptor
陷阱。因此,您可以通过执行以下操作来捕获 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
时必须 return 一组属性,因此在此用例中使用代理似乎并没有使事情变得更好。我认为对于大多数情况,以下方法同样有效并且不那么脆弱:
let obj = {};
let keys = ["a" , "b"];
for (let key of keys) {
obj[key] = {}; //relevant object
}
所以使用代理可能有点矫枉过正。