• 首页
  • vue
  • TypeScript
  • JavaScript
  • scss
  • css3
  • html5
  • php
  • MySQL
  • redis
  • jQuery
  • handler.ownKeys()

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

    语法

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

    参数

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

    target
    目标对象.

    返回值

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

    描述

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

    拦截

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

    • Object.getOwnPropertyNames()
    • Object.getOwnPropertySymbols()
    • Object.keys()
    • Reflect.ownKeys()

    约束

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

    • ownKeys的结果必须是一个数组.
    • 数组的元素类型要么是一个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