JS Proxy ownKeys()

🌙
手机阅读
本文目录结构

handler.ownKeys() 方法用于拦截 Reflect.ownKeys().

语法

var p = new Proxy(target, {
  ownKeys: function(target) {
  }
});

参数

下面的参数被传递给ownKeys。this被绑定在handler上。

target

目标对象.

返回值

ownKeys 方法必须返回一个可枚举对象.

描述

handler.ownKeys() 方法用于拦截 Reflect.ownKeys().

拦截

该拦截器可以拦截以下操作::

约束

如果违反了下面的约束,proxy将抛出错误 TypeError:

  • ownKeys 的结果必须是一个数组.
  • 数组的元素类型要么是一个 String ,要么是一个 Symbol.
  • 结果列表必须包含目标对象的所有不可配置(non-configurable )、自有(own)属性的key.
  • 如果目标对象不可扩展,那么结果列表必须包含目标对象的所有自有(own)属性的key,不能有其它值.

示例

下面的代码拦截 Object.getOwnPropertyNames().

var p = new Proxy({}, {
  ownKeys: function(target) {
    console.log('called');
    return ['a', 'b', 'c'];
  }
});

console.log(Object.getOwnPropertyNames(p)); // "called"
                                            // [ 'a', 'b', 'c' ]

下面的代码违反了约定

var obj = {};
Object.defineProperty(obj, 'a', { 
  configurable: false, 
  enumerable: true, 
  value: 10 }
);

var p = new Proxy(obj, {
  ownKeys: function(target) {
    return [123, 12.5, true, false, undefined, null, {}, []];
  }
});

console.log(Object.getOwnPropertyNames(p)); 

// TypeError: proxy [[OwnPropertyKeys]] 必须返回一个数组 
// 数组元素类型只能是String或Symbol

标准

Specification Status Comment
ECMAScript 2015 (6th Edition, ECMA-262)[[OwnPropertyKeys]] Standard Initial definition.
ECMAScript Latest Draft (ECMA-262)[[OwnPropertyKeys]] Draft

兼容性注意事项

Firefox火狐

  • 在Gecko 42 (Firefox 42 / Thunderbird 42 / SeaMonkey 2.39)版本中, ownKey 的实施已经更新了,为了反映最终的ES5标准 (see bug 1049662):
    • 现在需要检查结果是不是数组以及数组元素类型是不是string或symbol.
    • 枚举重复的自有的属性名称不再失败.

另见

AXIHE / 精选资源

浏览全部教程

面试题

学习网站

前端培训
自己甄别

前端书籍

关于朱安邦

我叫 朱安邦,阿西河的站长,在杭州。

以前是一名平面设计师,后来开始接接触前端开发,主要研究前端技术中的JS方向。

业余时间我喜欢分享和交流自己的技术,欢迎大家关注我的 Bilibili

关注我: Github / 知乎

于2021年离开前端领域,目前重心放在研究区块链上面了

我叫朱安邦,阿西河的站长

目前在杭州从事区块链周边的开发工作,机械专业,以前从事平面设计工作。

2014年底脱产在老家自学6个月的前端技术,自学期间几乎从未出过家门,最终找到了满意的前端工作。更多>

于2021年离开前端领域,目前从事区块链方面工作了