代码之家  ›  专栏  ›  技术社区  ›  John

用JavaScript动态创建新对象的更好方法?

  •  3
  • John  · 技术社区  · 14 年前

    我有两个这样定义的对象(为了这个问题简化了):

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

    @卡萨布兰卡:根据你所说的,我相信我需要在整个匿名函数中实际定义一个名称空间,因为一旦它完成,我就没有真正的方法可以再次直接引用该作用域。我想我知道我现在需要做什么,我希望有另一种方法来处理这个“新”的关键字-但似乎不是这样。

    2 回复  |  直到 14 年前
        1
  •  4
  •   Phrogz    14 年前

    假设我理解你的愿望(我不确定我是否理解),你可以使用 window 对象,或者创建自己对全局范围的引用,并使用该引用查找本地定义的变量。

    var $global = this;
    var firstObject = function(){};
    
    var objName = "firstObject";
    var instance = new $global[objName];
    
        2
  •  8
  •   casablanca    14 年前

    这:

    var dynamicallyCreateObject = new [type]();
    

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

    var dynamicallyCreateObject = new window[type]();
    

    理想情况下,它们应该在您自己的命名空间中,在这种情况下,您可以执行类似的操作:

    var dynamicallyCreateObject = new MyNamespace[type]();