Javascript 从字符串创建类定义
我正在尝试从字符串创建ES类定义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 =
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如果您想要类本身,我认为它更简单-请参阅上面的编辑