我使用babel.js traspiler编写ES6代码。
我有一个包含类名的字符串。我想要一个可以实例化的课程。怎么样?
我试过了:
eval("MyClassName") -> :(
window["MyClassName"] -> :(
有什么想法吗?
答案 0 :(得分:3)
你可以:
由于使用BabelJS,您必须转换为ES5模块加载器,它将非常简单(取决于您在转换时间指定的module format):
const MyClassName = require("MyClassName");
const obj = new MyClassName();
然而,这不是ES6 ,而是转换为ES5。因此,您的代码将无法在真正的ES6环境中运行。
在ES6环境中,class
只是函数的语法糖,因此没有理由不能这样做:
// Class definition
class MyClassName { }
// Pollute global scope
(global || window).MyClassName = MyClassName;
然后加载它:
const instance = new (window || global)["MyClassName"]();
但是在这样做的过程中,您只是打破了主要功能模块的优势。
你应该:
创建工厂类。在大多数情况下,您可以实例化的类数量是有限的。您应该创建一个工厂函数,它为您提供基于字符串的类实例:
import MyClassName from "./MyClassName"
class MyFactory {
static getInstance(value) {
if(value === "MyClassName") {
return new MyClassName();
}
throw new Error(`Could not instantiate ${value}`);
}
}
将用作:
import MyFactory from "./MyFactory";
const instance = MyFactory.getInstance("MyClassName");
显然,你可以扩展它以使用Map
而不是if
语句字符串,但你明白了。