尝试代理 ES6 class 构造函数时出现类型错误

TypeError when trying to Proxy a ES6 class constructor

我正在尝试代理 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 class(例如,这个 可以工作 通过 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 指的是 _Recordcstr指的是 Record 或其子项之一 类).