通过变量动态实例化一个类

时间:2009-05-28 22:45:08

标签: javascript mootools

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

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

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

3 个答案:

答案 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()语句在所有可用效果中进行选择,实例化正确的效果并返回它。

相关问题