我有以下代理:
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']
javascript
中,答案的值只由处理程序返回,而不是在target
对象中设置,对吗? - guest271314{}
没有设置任何实际属性; 虽然{}
没有在Proxy()
调用外部分配标识符,但可以使用函数参数引用目标对象。该数组或对象仅由函数return
返回,而不是在目标{}
处进行设置? - guest271314Object.defineProperty
定义a和b并将其设置为可枚举,那么应该能够列出它们,对吗?我尝试了一下,但没有成功。你有什么想法为什么会这样吗? - David Sarmiento