Javascript 从字符串创建类定义

Javascript 从字符串创建类定义,javascript,Javascript,我正在尝试从字符串创建ES类定义 const def = "class M {}"; // ??? const inst = new M(); 我不在窗口中,所以我不能使用基于DOM的方法,比如将它放在脚本标记中。我尝试了一些使用function()和eval()的方法,但没有真正成功 我最接近的是一个非常丑陋的工厂方法 const M = new Function('return new class M { test; constructor(){ this.test =

我正在尝试从字符串创建ES类定义

const def = "class M {}";
// ???
const inst = new M();
我不在窗口中,所以我不能使用基于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
不过,这并没有使用params调用构造函数

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 

实现这一点的一种方法是将实例化类的文本添加到字符串中,然后
eval
it:

const def='class M{}';
常量实例化器=def+';新M();';
const m=eval(实例化器);
编辑:
要跟进注释,如果需要类本身,则更简单—只需将其名称添加到正在计算的字符串中:

const def='class M{}';
const语句=def+';M、 ",;
常数M=评估(报表);
常数m=新的m();//现在可以了!

看到这一点,我在那个领域尝试了一些方法,但似乎
eval
并没有将类放在全局范围内,或者让它在
eval
生存期之外持久存在。与我对@Mureinik answer的评论类似,当运行
eval
时,类定义似乎在该上下文中可用,但一旦
eval
存在,定义就被释放。我需要它在创建代码后可用。这有什么用吗?这更简洁,但我真正需要做的是创建类本身,而不仅仅是实例。我在许多地方使用
Reflect.construct(classDef,[])
创建实例。@RandyBuchholz如果您想要类本身,我认为它更简单-请参阅上面的编辑