从字符串动态选择类 - “MyClassName” - > MyClassName

时间:2015-09-30 12:45:04

标签: javascript ecmascript-6 babeljs

我使用babel.js traspiler编写ES6代码。

我有一个包含类名的字符串。我想要一个可以实例化的课程。怎么样?

我试过了:

eval("MyClassName") -> :(
window["MyClassName"] -> :(

有什么想法吗?

1 个答案:

答案 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语句字符串,但你明白了。