如何使用变量实例化类

问题描述 投票:0回答:2

在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:argument不是Object而不是null”

有没有人知道为什么这些不适合我,和/或我如何根据包含类名的变量的值在Typescript中实例化一个类?谢谢!

javascript typescript object ecmascript-6
2个回答
3
投票

你不能用class做 - 你必须使用ES5构造函数:

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

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");}
}

代替

© www.soinside.com 2019 - 2024. All rights reserved.