我有两个这样定义的对象(为了这个问题简化了):
var firstObject = function(){ };
firstObject.prototype.doSomethingFirstObjectsDo();
var secondObject = function(){ };
secondObject.prototype.doSomethingSecondObjectsDo();
接下来,我有一个对象管理器,它作为主应用程序创建对象的接口:
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
}
};
这种方法工作得很好,但有一个缺点我可以看到,那就是您需要为每个可能创建的对象“类型”正式定义构造函数的名称。
如果我想创建一个已经正式定义的“thirdObject”,我还需要返回并在ObjectManager中添加对“thirdObject”构造函数的引用。
理想情况下,我希望消除对“ObjectManager”的需求,只需使用“new”关键字动态调用构造函数方法,如下所示:
//Inside MainApplication
for (var type in this.objectTypes)
{
var dynamicallyCreateObject = new [type](); //Invalid Syntax
};
有没有人想过用“new”关键字在JavaScript中动态创建不同对象的更好方法?
对一些初步意见的答复:
我应该提到整个应用程序都包含在一个匿名函数中。
(function(){
//All of My Mentioned Code is Found Here
$(document).ready(function(){
mainApp = window.mainApp = new MainApplication(options);
});
});
@卡萨布兰卡:根据你所说的,我相信我需要在整个匿名函数中实际定义一个名称空间,因为一旦它完成,我就没有真正的方法可以再次直接引用该作用域。我想我知道我现在需要做什么,我希望有另一种方法来处理这个“新”的关键字-但似乎不是这样。