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

时间:2017-03-29 21:24:31

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

我试图代理一个ES6构造函数(主要是试图模仿Python的描述符以获得乐趣和学习):



@license textAngular
Author : Austin Anderson
License : 2013 MIT
Version 1.5.16
// turn html into pure text that shows visiblity
function stripHtmlToText(html)
{
    var tmp = document.createElement("DIV");
    tmp.innerHTML = html;
    var res = tmp.textContent || tmp.innerText || '';
    res.replace('\u200B', ''); // zero width space
    res = res.trim();
    return res;
}




如果您运行此代码段,则会收到此错误:

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' 替换cstr.apply,构造函数会快速耗尽堆栈(显然会进入无限递归)。

如果我用一个函数替换new cstr类(例如,这个可以通过Babel转换),那么有效。我可以使用原生ES6吗?

谢谢。

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

1 个答案:

答案 0 :(得分:2)

部分

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

不适用于ES6课程。你需要使用

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

(而不是{I}}或Reflect.construct(cstr, args)您尝试做的事情,确实无限地进行了审判 - IIRC new cstr(...args)target_Record指的是cstr Record或其子类之一。)