Как динамически создавать новые объекты Javascript во время выполнения, учитывая только их имена классов? - PullRequest
1 голос
/ 04 января 2012

Допустим, есть несколько виджетов:

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 ]

2 голосов
/ 04 января 2012

Да, есть способ. Когда вы создаете функцию, она создается как свойство объекта this в этом контексте. Поэтому, если вы объявляете эти функции виджетов в глобальной области видимости, они становятся свойствами объекта window. Как вы, вероятно, знаете, вы можете получить доступ к свойству как object.property или object['property']. Так что, если они глобальные, вы можете сделать что-то вроде:

$.subscribe('/launch', function(widgetName, initData) {
    var widget = new window[widgetName](initData);
});

РЕДАКТИРОВАТЬ: Как T.J. Краудер сказал, я был ужасно неправ. То, что я сказал о функции, создаваемой как свойство this, применимо, когда вы находитесь в глобальной области действия (я хочу сказать, «только когда вы находитесь в глобальной области действия», но поскольку я не уверен на 100% Я оставлю это так).

1 голос
/ 04 января 2012

Как сказал комментарий Эсалиджии:

$.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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...