我想理解为什么不可能创建一个" 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不再起作用。
感谢您的帮助。
答案 0 :(得分:1)
代理实例是一个目标,因此比较(代理instanceof == target.constructor)将始终返回true。对代理的操作必须与目标对象类型一样。
在案例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中,因为函数具有不可配置的prototype
属性,并且代理必须是一个函数instance.so通过传递测试,handler.ownKeys()必须存在{ {1}}属性名称。任何定义为prototype
的属性,handler.ownkeys()必须存在..eg:包含可枚举的名称包括Object.defineProperty(foo, 'foo', {configurable: false})
。
foo
有很多代理示例here,您可以自己品尝这些示例。在品尝之后,您还可以深入了解代理文档。