【问题标题】:Dynamically init an instance with ES6 JavaScript class [duplicate]使用 ES6 JavaScript 类动态初始化实例 [重复]
【发布时间】:2015-12-31 12:24:20
【问题描述】:

如何使用 ES6 类动态初始化对象?

class AnObject{
    constructor(name) {
    this.name = name;
   }
}
let p1 = new AnObject("name1");
console.log("p1 name: " + p1.name);
var className = "An" + "Object";
let p2 = new className("name2"); // Dynamically init an object?
console.log("p2 name: " + p2.name);

【问题讨论】:

  • 它与 ES5 中没有什么不同——AnObject 只是一个函数,在调用 new 之前,您必须通过它的名称获取该函数。对类使用 ES6 语法使差异为零。
  • @Bergi:是的,这可能是重复的。尽管有一个非常细微的区别:如果您在全局范围内,则不能使用全局对象中的类,因为全局范围内的类标识符不会添加到全局对象中,即使它们是全局变量。 (与全局范围内的 letconst 一样。)

标签: javascript ecmascript-6


【解决方案1】:

执行此操作的常用方法是将构造函数放在一个对象上,然后使用生成的字符串键在该对象上查找它们:

let ctors = {
    AnObject: class {
        constructor(name) {
            this.name = name;
        }
    }
};

let className = "An" + "Object";
let p2 = new ctors[className]("name2");
console.log("p2 name: " + p2.name);

Live copy on Babel's REPL


或者,我只是在这里完成不推荐它,你可以使用eval

class AnObject {
    constructor(name) {
        this.name = name;
    }
}
let className = "An" + "Object";
let p2 = new (eval(className))("name2");
console.log("p2 name: " + p2.name)

Live copy on Babel's REPL

或者更详细一点,但可能更清楚:

let className = "An" + "Object";
let ctor = eval(className);
let p2 = new ctor("name2");
console.log("p2 name: " + p2.name)

eval 没问题,只要您完全控制要评估的字符串。但在结构良好的代码中,这通常是多余的。

【讨论】:

    猜你喜欢
    • 2017-02-09
    • 2014-03-22
    • 2017-10-21
    • 2017-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多