这篇翻译不完整。请帮忙从英语翻译这篇文章

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]]
Living Standard  

浏览器兼容

Feature Chrome Firefox (Gecko) Internet Explorer Opera Safari
Basic support ? 18 (18) ? ? ?
Feature Android Chrome for Android Firefox Mobile (Gecko) IE Mobile Opera Mobile Safari Mobile
Basic support ? ? 18.0 (18) ? ? ?

兼容性注意事项

Firefox火狐

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

另见

文档标签和贡献者

 此页面的贡献者: DuLinRain
 最后编辑者: DuLinRain,