首页 > 解决方案 > 用 window[string]() 实例化一个类对象

问题描述

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

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

我到底在这里想念什么?

标签: javascriptclass

解决方案


用 and 声明的变量的行为与用andclass声明的变量类似——它们不会被隐式分配给窗口对象(这可以说是一件好事)。如果你想穿上,你必须明确地这样做:constletUnitwindow

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

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

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

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

var str = "Unit";
var a = new myClasses[str]();

在声明对象字面量的过程中,对象值不能相互引用 - 要在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]();


推荐阅读