我有以下代理:
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']