javascript - 从字符串中动态选择类 - "MyClassName"-> MyClassName

标签 javascript ecmascript-6 babeljs

<分区>

我使用 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/

相关文章:

javascript - 让 Heroku 的配置变量在 node.js 中工作

babeljs - 防止 Babel 使用 .babelrc

javascript - 如何让 React 与 Babel 和 Gulp 配合使用?

javascript - Chart.js 将填充添加到比例

javascript - Select2 on change 事件在 Vuejs 中不起作用

javascript - 如何计算圈复杂度?

javascript - React 应用导入重复

typescript - Resharper 将我的 Promise 标记为错误

javascript - JavaScript map 对象是否被索引以优化 map.get?

javascript - 删除生产分发文件中的一些代码行?