5

如何通过输入变量名来实例化一个类?在一个类中考虑这个方法:

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

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

console.log(build.effect) 打印出“MarioKartMenu”。但我当然得到: TypeError: Result of expression 'build.effect' [MarioKartMenu] is not a constructor。

如果我破坏活力并像这样编写代码:

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

它工作得很好。是否有可能像我试图做的那样让它充满活力?

4

3 回答 3

5

如果函数MarioKartMenu是在全局范围内定义的,您可以使用它的字符串名称访问它:

window["MarioKartMenu"]

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

鉴于上述情况,您可以使用以下方法实现您想要的:

var menuConstructor = window[build.effect];
var animationClass = new menuConstructor(el, build);
于 2009-05-28T22:51:40.720 回答
2

只需将构造函数分配给build.effect(不是包含其名称的字符串),它应该可以工作:

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

b = ...;
b.effect = MarioKartMenu;
animate(e, b);
于 2009-05-28T22:55:19.093 回答
0

我的第一个想法是使用 JavaScript 的eval()运算符,尽管我知道这是一个不太优雅的解决方案。(像这样的事情:var animationClass = eval("new "+build.effect+"(el, build)");虽然我不确定这是正确的,因为我以前没有eval()这样使用过。)。艾曼的回答是对这个想法的一个更好的变体。

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

于 2009-05-28T22:54:13.837 回答