【发布时间】:2016-11-01 00:43:18
【问题描述】:
我有以下代理:
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']。
代码sn-p:
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']
【问题讨论】:
标签: javascript ecmascript-6 es6-proxy