2009-05-28 39 views
5

如何通过抛出变量名来实例化一个类? 考虑这个方法的类中:通过变量动态实例化一个类

animate: function(el, build) { 
     console.log(build.effect); 
     var animationClass = new build.effect(el,build); 
}, 

版本是包含的东西很多对象,但最重要的 “效果”。这个效果是一个独立动画类的名字 - 一个叫做“MarioKartMenu”。

console.log(build.effect)打印出“MarioKartMenu”。 但我当然得到:TypeError:表达式'build.effect'的结果[MarioKartMenu]不是构造函数。

如果我垃圾的活力,只是使代码为这样:

animate: function(el, build) { 
     var animationClass = new MarioKartMenu(el,build); 
    }, 

它工作得很好。是否有可能使它像我试图做的那样动态?

回答

5

如果函数MarioKartMenu在全球范围内被定义,你可以通过它的字符串名称使用访问:

window["MarioKartMenu"] 

这工作,因为所有的全局变量是window对象的属性。

鉴于上述情况,你可以实现你想要的使用:

var menuConstructor = window[build.effect]; 
var animationClass = new menuConstructor(el, build); 
+0

完美,我有它感觉它看起来类似的东西。谢谢。 – 2009-05-28 22:53:10

+0

如果它是在一个js类中,你可以使用**这个[“MarioKartMenu”] **。我对此感到一阵子并想出了它! – IJas 2014-03-23 09:04:04

0

我首先想到的是使用JavaScript的eval()运营商,虽然我知道这是一个不到完美的解决方案。 (像这样的东西:var animationClass = eval("new "+build.effect+"(el, build)");虽然我不确定这是否正确,因为我之前没有使用过这种类型的eval())。艾曼的回答是这个想法的一个更好的变化。

我的第二个想法是MarioKartMenu是不适当的抽象。所以我会围绕它构建一个简单的类,它将效果名称作为第三个参数,并使用switch()语句在所有可用效果中进行选择,然后实例化正确的效果并将其返回。

+0

好的建议。最后,我不知道会有什么效果,因为调用动画类的类将完全可扩展,以允许任何人创建和使用他们自己的动画。所以switch语句不起作用。 – 2009-05-28 22:59:38

2

刚分配构造函数build.effect(不包含其名称的字符串),它应该工作:

animate = function(el, build) { 
    var animationClass = new build.effect(el,build); 
} 
// ... 

b = ...; 
b.effect = MarioKartMenu; 
animate(e, b);