javascript - 尝试代理 ES6 类构造函数时出现 TypeError

标签 javascript node.js ecmascript-6 es6-proxy

我正在尝试代理 ES6 构造函数(主要是为了乐趣和学习而模拟 Python 的描述符):

class _Record {
    constructor(data) {
        this._data = data;
    }
}

const constrProxyHandlers = {
    construct: function(target, args, cstr) {
        let instProxyHandler = {
            get: (target, prop) => {
                if(prop in target._data) { return target._data[prop] }
                return target[prop]
            },
            set: (target, prop, val) => {
                if(prop in target._data) {
                    target._data[prop] = val;
                } else {
                    target[prop] = val;
                }
                return true
            }
        }
        
        let obj = Object.create(cstr.prototype)
        cstr.apply(obj, args)
        return new Proxy(obj, instProxyHandler)
    }
}

const Record = new Proxy(_Record, constrProxyHandlers)

let rec = new Record({name: 'Vic', age: 25})
console.log([rec.name, rec.age])
rec.name = 'Viktor'
console.log(rec)

如果运行此代码片段,您将收到以下错误:

cstr.apply(obj, args)

TypeError: Class constructor _Record cannot be invoked without 'new'

如果我用 new cstr 替换 cstr.apply,构造函数会很快耗尽堆栈(显然会进入无限递归)。

如果我用函数替换 _Record 类,这个可以工作(例如,通过 Babel 转译这个可以工作)。我可以让它与原生 ES6 一起工作吗?

谢谢。

P。 S. 我目前正在 Node 7.7.4 上检查这些片段(如果重要的话)。

最佳答案

部分

let obj = Object.create(cstr.prototype)
cstr.apply(obj, args)

不适用于 ES6 类。您需要使用

let obj = Reflect.construct(target, args, cstr);

(而不是您尝试执行的 Reflect.construct(cstr, args)new cstr(...args) ,这确实无限递归 - IIRC target 引用 _Record,而 cstr 引用 Record 或其子类之一。

关于javascript - 尝试代理 ES6 类构造函数时出现 TypeError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43104420/

相关文章:

javascript - 使用 Express 路由器在浏览器中获取 "Cannot GET/"

javascript - 使用 Bootstrap 和 AngularJS 进行表单验证

node.js - Vue Node.js/express 应用程序错误无法设置未定义的属性渲染

node.js - Module.export 一个 'default' 函数

javascript - node.js 需要一个 json 文件

javascript - 如何让我的 ember.js 应用程序导入从 bower 或 npm 安装的模块

javascript - 当用户在第 2 页提交时,如何将第 1 页表单的发布值存储在数据库中?

javascript - es6 使用常量解构对象

javascript - 为什么这个迭代器返回以下值?

javascript - CKEDITOR 初始化时没有为任何对话框调用“dialogDefinition”事件?