如何通过引入变量名来实例化一个类? 在类中考虑这个方法:
animate: function(el, build) {
console.log(build.effect);
var animationClass = new build.effect(el,build);
},
Build是一个包含很多东西的对象,但最重要的是一个 “影响”。此效果是独立动画类的名称 - 一个被称为“MarioKartMenu”。
console.log(build.effect)打印出“MarioKartMenu”。 但当然我得到:TypeError:表达式'build.effect'的结果[MarioKartMenu]不是构造函数。
如果我摒弃了这种活力,只需制作代码:
animate: function(el, build) {
var animationClass = new MarioKartMenu(el,build);
},
它运作得很好。是否有可能让它像我试图做的那样充满活力?
答案 0 :(得分:5)
如果在全局范围中定义了函数MarioKartMenu
,则可以使用以下字符串名称访问它:
window["MarioKartMenu"]
这是有效的,因为所有全局变量都是window
对象的属性。
鉴于上述情况,您可以使用以下方法实现所需内容:
var menuConstructor = window[build.effect];
var animationClass = new menuConstructor(el, build);
答案 1 :(得分:2)
只需将构造函数分配给build.effect
(不是包含其名称的字符串),它应该可以工作:
animate = function(el, build) {
var animationClass = new build.effect(el,build);
}
// ...
b = ...;
b.effect = MarioKartMenu;
animate(e, b);
答案 2 :(得分:0)
我的第一个想法是使用JavaScript的eval()
运算符,但我知道这不是一个优雅的解决方案。 (像这样的东西:var animationClass = eval("new "+build.effect+"(el, build)");
虽然我不确定这是否正确,因为我之前没有像这样使用eval()
。)。艾曼的回答是对这个想法的一个更好的变化。
我的第二个想法是MarioKartMenu
不适合抽象。所以我围绕它构建一个简单的类,它将效果名称作为第三个参数,并使用switch()
语句在所有可用效果中进行选择,实例化正确的效果并返回它。