Лучший способ динамически создавать новые объекты в JavaScript? - PullRequest
3 голосов
/ 19 ноября 2010

У меня есть два объекта, которые определены примерно так (упрощенно ради вопроса):

var firstObject = function(){ };
firstObject.prototype.doSomethingFirstObjectsDo();

var secondObject = function(){ };
secondObject.prototype.doSomethingSecondObjectsDo();

Далее у меня есть Object Manager, который работает как своего рода интерфейс для моего основного приложения для создания объектов:

var ObjectManager = function()
{
    this.create = {
        FIRST:firstObject,
        SECOND:secondObject
    };
};

ObjectManager.prototype.createObject = function(type)
{
    return new this.create[type]();
};

И, наконец, пример основного приложения, использующего диспетчер объектов для динамического создания либо firstObjects, либо secondObjects:

var MainApplication = function(options)
{
    this.objectTypes = options.objectTypes;
    this.objManager = new ObjectManager();
};

MainApplication.prototype.createObjects = function()
{
    //Iterate through all the types this application needs to create
    for (var type in this.objectTypes)
    {
        var dynamicallyCreatedObject = this.objManager.createObject(type);
        //Do Something Else
    }
};

Этот подход прекрасно работает, но у меня есть один недостаток, заключающийся в том, что вам необходимо формально определить имя функции конструктора для каждого объекта "Тип", который может быть создан.

В случае, если я хотел создать "третий объект" - который уже был бы формально определен - мне также нужно было бы вернуться и добавить ссылку на функцию конструктора "третьего объекта" в ObjectManager.

В идеале я хотел бы убрать необходимость в "ObjectManager" и просто иметь возможность динамически вызывать метод конструктора с помощью ключевого слова "new", например:

//Inside MainApplication
for (var type in this.objectTypes)
{
    var dynamicallyCreateObject = new [type]();  //Invalid Syntax
};

У кого-нибудь есть мысли по поводу лучшего способа динамически создавать различные объекты в JavaScript с помощью ключевого слова "new"?


Ответ на некоторые начальные комментарии:

Я должен был упомянуть, что все приложение заключено в анонимную функцию.

(function(){
    //All of My Mentioned Code is Found Here
    $(document).ready(function(){
        mainApp = window.mainApp = new MainApplication(options);
    });
});

@ casablanca: Исходя из того, что вы говорите, я считаю, что мне действительно нужно определить пространство имен внутри всей анонимной функции, так как после ее завершения у меня нет реального способа снова напрямую обратиться к этой области. Я думаю, что знаю, что мне нужно сделать сейчас, я как бы надеялся, что есть еще один способ работы с этим «новым» ключевым словом - но, похоже, это не так.

Ответы [ 2 ]

8 голосов
/ 19 ноября 2010

Это:

var dynamicallyCreateObject = new [type]();

почти правильно, за исключением того, что вам нужен внешний объект для доступа к свойствам. В случае если ваши конструкторы являются глобальными, вы можете использовать window:

var dynamicallyCreateObject = new window[type]();

В идеале, они должны быть в вашем собственном пространстве имен, в этом случае вы можете сделать что-то похожее:

var dynamicallyCreateObject = new MyNamespace[type]();
4 голосов
/ 19 ноября 2010

Предполагая, что я понимаю ваше желание (и я не уверен в этом), вы можете использовать глобальный объект window в браузерах DOM 0 или создать свою собственную ссылку на глобальную область видимости и использовать ее для поиска переменныхопределяется локально.

var $global = this;
var firstObject = function(){};

var objName = "firstObject";
var instance = new $global[objName];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...