ES6"通用"代理

时间:2017-02-28 19:49:12

标签: javascript ecmascript-6 es6-proxy

我想理解为什么不可能创建一个" universal"使用ES6转发代理。 通过"通用"我的意思是代理目标可以是具有相同代理声明(构造函数+处理程序)的任何类型的非原始值(包括函数)。

案例1:

var o = function myCtor() {}

var p = new Proxy({}, {
    construct: function(target, ...args) {
        return Reflect.construct(o, ...args);
    }
});

console.log(new p); // TypeError: p2 is not a constructor

案例2:

var o = {}

var p = new Proxy(function() {}, {
    ownKeys: function(target) {
        return Reflect.ownKeys(o);
    }
});

console.log(Object.keys(p)); // TypeError: 'ownKeys' on proxy: trap result did not include 'arguments'

当我使用function(){}作为代理目标(而不是{})时,案例1正常工作但是,案例2不再起作用。

感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

代理实例是一个目标,因此比较(代理instanceof == target.constructor)将始终返回true。对代理的操作必须与目标对象类型一样。

  1. 在案例1中,一个Proxy返回一个Object实例,是一个实例但不是一个Function实例,因此不能用new关键字调用。所以你可以通过通过传递一个Function实例来测试。

     var o = function myCtor() {}
    
        var p = new Proxy(function(){}, {
            construct: function(target, ...args) {
                return Reflect.construct(o, ...args);
            }
        });
    
        console.log(new p);
    
  2. 在案例2中,因为函数具有不可配置的prototype属性,并且代理必须是一个函数instance.so通过传递测试,handler.ownKeys()必须存在{ {1}}属性名称。任何定义为prototype的属性,handler.ownkeys()必须存在..eg:包含可枚举的名称包括Object.defineProperty(foo, 'foo', {configurable: false})

    foo
  3. 有很多代理示例here,您可以自己品尝这些示例。在品尝之后,您还可以深入了解代理文档。