我试图代理一个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上的这些片段,如果重要的话。
答案 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
或其子类之一。)