我正在尝试从字符串创建ES类定义。
const def = "class M {}";
// ???
const inst = new M();
我不在Window中,所以不能使用基于DOM的方法,例如将其放入脚本标签中。我用function()
和eval()
尝试了几种方法,但没有真正的成功。
我最接近的是一种非常丑陋的工厂方法。
const M = new Function('return new class M { test; constructor(){ this.test = "Hello"; } tfun(input){ return input + 7; } }');
const inst = new M();
inst.test; // Hello
inst.tfun(5); // output: 12
这不会用参数调用构造函数。
const M = new Function('return new class M { test; constructor(param){ this.test = param; } tfun(input){ return input + 7; } }');
const inst = new M("Hello");
inst.test; // undefined
答案 0 :(得分:2)
一种实现此目的的方法是在字符串中添加实例化该类的文本,然后eval
将其实例化:
const def = 'class M {}';
const instantiator = def + '; new M();';
const m = eval(instantiator);
编辑:
要对注释进行后续处理,如果您想要类本身,它甚至更简单-只需将其名称添加到您要评估的字符串中即可:
const def = 'class M {}';
const statement = def + '; M;';
const M = eval(statement);
const m = new M(); // This now works!