javascript - 在 JavaScript 中动态创建新对象的更好方法?

标签 javascript design-patterns object

我有两个对象定义如下(为了问题而简化):

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

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

接下来我有一个对象管理器,它作为我的主应用程序创建对象的一种接口(interface):

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);
    });
});

@casablanca:从你所说的来看,我相信我需要在整个匿名函数中实际定义一个 NameSpace,因为一旦完成,我就没有真正的方法可以再次直接引用该范围。我想我知道我现在需要做什么,我有点希望有另一种方法来处理那个"new"关键字 - 但事实似乎并非如此。

最佳答案

这个:

var dynamicallyCreateObject = new [type]();

几乎是正确的,除了你需要一个外部对象来访问属性。如果您的构造函数是全局的,您可以使用 window:

var dynamicallyCreateObject = new window[type]();

理想情况下,它们应该在您自己的命名空间内,在这种情况下您可以做类似的事情:

var dynamicallyCreateObject = new MyNamespace[type]();

关于javascript - 在 JavaScript 中动态创建新对象的更好方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4220479/

相关文章:

c++ - 不能在派生对象上运行虚函数

javascript - Backbone.Marionette - 以某种方式收集 "missing"一些元素

sql - 同步客户端-服务器数据库

java - 实例变量声明语法

algorithm - 迭代循环和打印开始和结束标签的标准模式

ruby - heroku 如何将其身份验证存储在其命令行应用程序中?

c++ - std::vector 和构造函数

javascript - 在 Highcharts 列上标记特定点

javascript - 当幻灯片总数和显示的幻灯片数量相等并且 slider 也不滑动时,光滑的 slider 箭头会隐藏

javascript - 在 WebGL 中绘制多个 2D 图像