gpt4 book ai didi

javascript - 为什么 ownKeys 代理陷阱不能与 Object.keys() 一起使用?

转载 作者:行者123 更新时间:2023-12-03 23:01:48 25 4
gpt4 key购买 nike

documentation of the Proxy ownKeys trap on MDN它声明它将拦截Object.keys()调用:

This trap can intercept these operations:

Object.getOwnPropertyNames()

Object.getOwnPropertySymbols()

Object.keys()

Reflect.ownKeys()


但是,根据我的测试,它似乎不适用于 Object.keys :

const proxy = new Proxy({}, {
ownKeys() {
console.log("called")
return ["a", "b", "c"]
}
})

console.log(Object.keys(proxy))

console.log(Object.getOwnPropertyNames(proxy))

console.log(Reflect.ownKeys(proxy))

MDN 错了,还是我做错了什么?

最佳答案

原因很简单:Object.keys仅返回带有 enumerable 标志的属性。为了检查它,它调用内部方法[[GetOwnProperty]]为每个属性获取其描述符。而这里,由于没有属性,它的描述符是空的,没有可枚举的标志,所以它被跳过了。
对于 Object.keys要返回一个属性,我们需要它存在于对象中,带有 enumerable 标志,或者我们可以拦截对 [[GetOwnProperty]] 的调用(陷阱 getOwnPropertyDescriptor 执行此操作),并返回一个带有 enumerable: true 的描述符。
这是一个例子:

let user = { };

user = new Proxy(user, {
ownKeys(target) { // called once to get a list of properties
return ['a', 'b', 'c'];
},

getOwnPropertyDescriptor(target, prop) { // called for every property
return {
enumerable: true,
configurable: true
/* ...other flags, probable "value:..." */
};
}

});

console.log( Object.keys(user) ); // ['a', 'b', 'c']

Source

关于javascript - 为什么 ownKeys 代理陷阱不能与 Object.keys() 一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65339985/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com