javascript - ES6 "universal"代理

标签 javascript ecmascript-6 es6-proxy

我想了解为什么无法使用 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. 在情况 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 中,因为 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/

相关文章:

Javascript 返回数组中最高分的出现次数

javascript - 如何使用代理来观察变量是否(不再)未定义

node.js - 使用 ES6 Proxy 和 node.js 的非法调用错误

javascript - 从现有代理实例中检索原始目标对象

javascript - 无法使用 JavaScript 设置日期输入值

javascript - 使用 ng-repeat 用数组中的数据填充表行

javascript - Vue.js:观察数组长度

javascript - 调用函数时如何传入参数名称?

javascript - Webpack 导出的变量在浏览器中不可见

javascript - 为什么这只是迭代 HTMLCollection 的奇数元素?