У меня есть два объекта, которые определены примерно так (упрощенно ради вопроса):
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: Исходя из того, что вы говорите, я считаю, что мне действительно нужно определить пространство имен внутри всей анонимной функции, так как после ее завершения у меня нет реального способа снова напрямую обратиться к этой области. Я думаю, что знаю, что мне нужно сделать сейчас, я как бы надеялся, что есть еще один способ работы с этим «новым» ключевым словом - но, похоже, это не так.