用window [string]()实例化一个类对象

use*_*806 2 javascript class

class Unit {
  constructor(){
  }
}    

var str = "Unit";
var a = new window[str](); // error
var b = new window["Unit"](); // error

var u = new Unit(); // works
    (u instanceof Unit) // true
Run Code Online (Sandbox Code Playgroud)

我只是最近才在声明类方面切换到ES 6语法。我非常确定以前我可以实例化这样的类,但是自从我使用“类”语法以来,通过windowclassName实例化对象就不再起作用了。

我到底在这里想念什么?

Cer*_*nce 5

用声明的变量的class行为与用const和声明的变量的行为类似let-它们不会隐式分配给window对象(这可以说是一件好事)。如果你想放Unitwindow,你就必须这样做明确:

class Unit {
  constructor(){
    console.log('constructing');
  }
}    
window.Unit = Unit;

var str = "Unit";
var a = new window[str]();
Run Code Online (Sandbox Code Playgroud)

您可以考虑使用自己的类对象来避免全球污染:

const myClasses = {
  Unit: class Unit {
    constructor(){
      console.log('constructing');
    }
  }
};

var str = "Unit";
var a = new myClasses[str]();
Run Code Online (Sandbox Code Playgroud)

在声明对象文字的过程中,对象值不能相互引用-要在子类上myClasses扩展现有类之一,则必须在myClasses声明之外进行操作:

const myClasses = {
  Unit: class Unit {
    constructor(){
      console.log('constructing');
    }
  }
};
myClasses.Child = class Child extends myClasses.Unit {
  constructor() {
    super();
    console.log('Child running');
  }
}

var str = "Child";
var a = new myClasses[str]();
Run Code Online (Sandbox Code Playgroud)