<分区>
我使用 babel.js traspiler 编写 ES6 代码。
我有一个包含类名的字符串。我想要一个可以实例化的类。怎么办?
我试过:
eval("MyClassName") -> :(
window["MyClassName"] -> :(
有什么想法吗?
<分区>
我使用 babel.js traspiler 编写 ES6 代码。
我有一个包含类名的字符串。我想要一个可以实例化的类。怎么办?
我试过:
eval("MyClassName") -> :(
window["MyClassName"] -> :(
有什么想法吗?
最佳答案
您可以:
由于使用 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
语句,但您明白了。
关于javascript - 从字符串中动态选择类 - "MyClassName"-> MyClassName,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32866478/