我想了解为什么无法使用 ES6 创建“通用”转发代理。 “通用”是指代理目标可以是具有相同代理声明(构造函数 + 处理程序)的任何类型的非原始值(包括函数)。
案例一:
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
案例二:
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 不再工作。
感谢您的帮助。
最佳答案
一个Proxy实例是一个目标,所以比较(proxy 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 中,因为 Function 有一个不可配置的
prototype
属性并且代理必须是一个 Function 实例。所以通过测试 handler.ownKeys() 必须存在prototype
属性名称。任何定义为Object.defineProperty(foo, 'foo', {configurable: false})
的属性 handler.ownkeys() 必须存在it.e.g:必须包含可枚举的名称,包括foo
。var o = {prototype:{}} var p = new Proxy(function() {}, { ownKeys: function(target) { return Reflect.ownKeys(o); } }); console.log(Object.keys(p));
有很多代理例子here ,你可以自己去品尝这些例子,品尝之后你还可以深入地看到代理文档。
关于javascript - ES6 "universal"代理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42517528/