如何使用变量实例化类

时间:2019-04-02 04:00:24

标签: javascript typescript object ecmascript-6

在TypeScript中,我在其他讨论中看到应该有一种方法来创建其类型取决于变量的类。

例如,如果我们有。 。 。

class MyClass {    
   someFunc(){alert("Hello");}    
}
var myClassName = "MyClass";

答案可能是:

答案#1:
var myClassInstance = new (<any>window)[myClassName]();

答案2:
var myClassInstance = Object.create(window[myClassName]);

我正在控制台中尝试这些,但对我都不起作用。
对于#1,我收到错误消息:“语法错误”,或者如果我省略<any>,则“对象不支持此操作”。
对于#2,我收到错误消息:“ Object.create:参数不是对象,也不为空”

有人知道为什么这些方法对我不起作用,和/或如何根据持有类名的变量的值实例化Typescript中的类吗?谢谢!

2 个答案:

答案 0 :(得分:3)

您无法使用class来完成它-您必须使用ES5构造函数:

function MyClass() {}
MyClass.prototype.someFunc = function() {
  alert("Hello!");
};
var myClassName = "MyClass";
var myClassInstance = new window[myClassName]();
myClassInstance.someFunc();

答案 1 :(得分:1)

这些“答案”不起作用的原因是因为MyClass不是全局对象的属性(在您的情况下为窗口)

对于在全局范围内使用letconst声明的变量也是如此

但是,由于您似乎愿意改用旧式定义,即愿意重写类定义,因此您始终可以使用它-只需很少的重写就可以了

注意:请使用var而不是letconst

var MyClass = class MyClass {    
   someFunc(){alert("Hello");}
}
var AnotherClass = class AnotherClass {    
   someFunc(){alert("Hello again");}
}
var YetAnotherClass = class YetAnotherClass {    
   someFunc(){alert("Hello once more");}
}

然后您可以简单地

let instance = new window[myClassName]();

此外,取决于类的定义位置/方式(在导入中?),实际上可能需要执行类似的操作

window.MyClass = class MyClass {    
   someFunc(){alert("Hello");}
}

代替