handler.ownKeys() 方法用于拦截对象自身属性的读取操作。
const proxy = new Proxy(target, {ownKeys: function (target) {// do something},});
| 参数 | 说明 | 类型 |
|---|---|---|
target | 目标对象 | object |
ownKeys 方法必须返回一个可枚举对象。
该方法会拦截目标对象的以下操作:
Object.getOwnPropertyNames()Object.getOwnPropertySymbols()Object.keys()Reflect.ownKeys()如果违背了以下的约束,proxy 会抛出 TypeError:
ownKeys 的结果必须是一个数组keykey,不能有其他值const proxy = new Proxy({},{ownKeys(target) {console.log('Called');return ['a', 'b', 'c'];},});console.log(Object.getOwnPropertyNames(proxy));// 'Called'// ['a', 'b', 'c']
for...in 循环也受到 ownKeys() 方法的拦截:
const target = {foo: 'bar',};const proxy = new Proxy(target, {ownKeys: function () {return ['a', 'b'];},});for (let key in proxy) {console.log(key);// 没有任何输出}
上面代码中,ownKeys() 指定只返回 a 和 b 属性,由于 target 没有这两个属性,因此 for...in 循环不会有任何输出。
ownKeys() 方法返回的数组成员,只能是字符串或 Symbol 值。如果有其他类型的值,或者返回的根本不是数组,就会报错。
const target = {};const proxy = new Proxy({},{ownKeys: function (target) {return [123, true, undefined, null, {}, []];},});Object.getOwnPropertyNames(proxy);// Uncaught TypeError: 123 is not a valid property name