如何仅在给定类名的情况下在运行时动态创建新的Javascript对象?

时间:2012-01-04 18:26:56

标签: javascript oop reflection

让我们说有一些小部件:

function Widget1(initData) {
        ....
} 
Widget1.prototype.render = function() {
    ....
}


function Widget2(initData) {
    ....
}  
Widget2.prototype.render = function() {
    ....
}

我需要做的是:

$.subscribe('/launch', function(widgetName, initData) {
    // create a new object of the widget and then call the render method
});

我不想写多个if-else块,因为小部件的数量可能变得非常大。一种选择是使用eval(),但我相信可能有更好的技术。我正在使用JQuery框架,因此不要包含任何其他可能具有特定功能的框架来支持这一点。一个纯粹的Javascript解决方案将不胜感激。

2 个答案:

答案 0 :(得分:2)

是的,有办法。创建函数时,它将作为该上下文中this对象的属性创建。因此,如果在全局范围内声明这些Widget函数,它们将成为window对象的属性。您可能知道,您可以object.propertyobject['property']访问该媒体资源。因此,如果它们是全球性的,您可以执行以下操作:

$.subscribe('/launch', function(widgetName, initData) {
    var widget = new window[widgetName](initData);
});
编辑:正如T.J.克劳德说,我非常错。当你在全局范围内时,我所说的关于作为this属性创建的函数的说法(我想说“只有当你在全局范围内时”),但因为我不是100我肯定会留下它。)

答案 1 :(得分:1)

正如Esalijia的评论所说:

$.subscribe('/launch', function(widgetName, initData) {
    // create a new object of the widget and then call the render method
    widget = new window[widgetName]();
});

或者您可以bind Widget*使用.bind()定义$.subscribe的范围,并将其用于{{1}}方法。