我有以下代理:
const p = new Proxy({}, {
ownKeys(target) {
return ['a', 'b'];
},
});
MDN说:
这个陷阱可以拦截这些操作:
Object.getOwnPropertyNames()Object.getOwnPropertySymbols()Object.keys()Reflect.ownKeys()
因此,我期望Object.getOwnPropertyNames()和Object.keys()产生相同的输出。但是,Object.getOwnPropertyNames(p)返回['a', 'b'](如预期),但Object.keys(p)返回一个空数组。这是为什么?
此外,如果我向该对象添加一个未由ownKeys处理程序返回的属性(例如c),它会被两个函数忽略(它们不会更改其输出)。但是,当我添加ownKeys处理程序返回的属性(例如a)时,Object.keys(p)现在返回['a'].
代码片段:
const p = new Proxy({}, {
ownKeys(target) {
return ['a', 'b'];
},
});
console.log(Object.getOwnPropertyNames(p)); // ['a', 'b']
console.log(Object.keys(p)); // []
p.c = true;
console.log(Object.getOwnPropertyNames(p)); // ['a', 'b']
console.log(Object.keys(p)); // []
p.a = true;
console.log(Object.getOwnPropertyNames(p)); // ['a', 'b']
console.log(Object.keys(p)); // ['a']
