网站搜索

javascript - 如何使用变量实例化类


在 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: 参数不是对象也不是 null”

有人知道为什么这些对我不起作用吗?或者,我如何根据保存类名的变量的值在 Typescript 中实例化一个类?谢谢!

答案#1

你不能用class来做——你必须使用一个ES5构造函数:

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

答案#2

这些“答案”不起作用的原因是因为 MyClass 并不是全局对象(在你的例子中是 window)的属性

这同样适用于使用 let 和 const 在全局作用域中声明的变量

然而,既然你似乎愿意切换到老派定义,也就是愿意重写类定义,你总是可以使用这个——额外的好处是几乎不需要重写。

注意:使用 var 而不是 let 或 const

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

相反