2010-11-18 21 views
3

Ich habe zwei Objekte definiert so etwas wie dies (aus Gründen der Frage vereinfacht):Besserer Weg, um dynamisch neue Objekte in JavaScript zu erstellen?

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

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

Next ich einen Objekt-Manager haben, die als eine Art Schnittstelle für meine Hauptanwendung funktioniert Objekte zu erstellen:

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

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

schließlich ein Beispiel für die Hauptanwendung des Objekt-Manager erstellen Sie entweder zur dynamischen firstObjects oder 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 
    } 
}; 

Dieser Ansatz funktioniert gut, hat aber einen Nachteil, den ich sehen kann - dass Sie den Namen der Konstruktorfunktion für jedes Objekt "Type", das erstellt werden könnte, formal definieren müssen.

Für den Fall, dass ich ein "thirdObject" erstellen wollte - was bereits formal definiert wäre - müsste ich auch zurückgehen und einen Verweis auf die Konstruktorfunktion von "thirdObject" im ObjectManager hinzufügen.

Im Idealfall würde Ich mag die Notwendigkeit einer „Objektmanager“ entfernen und einfach in der Lage sein, dynamisch mit dem „neuen“ den Konstruktor-Methode aufrufen, wie dieses Stichwort:

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

Jedes haben alle Gedanken an ein bessere Möglichkeit, verschiedene Objekte in JavaScript mit dem Schlüsselwort "new" dynamisch zu erstellen?


Als Reaktion auf einige erste Bemerkungen:

ich erwähnt habe, sollte, dass die gesamte Anwendung innerhalb einer anonymen Funktion eingeschlossen ist.

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

@casablanca: Von dem, was Sie sagen, ich glaube, ich werde tatsächlich benötigen, um einen Namespace innerhalb der gesamten anonymen Funktion zu definieren, da einmal beendet es Ich habe keine wirkliche Möglichkeit, direkt wieder in diesem Umfang zu beziehen. Ich denke, ich weiß, was ich jetzt tun muss, ich hoffte irgendwie, dass es eine andere Möglichkeit gibt, mit diesem "neuen" Schlüsselwort zu arbeiten - aber so scheint es nicht zu sein.

+1

Was möchten Sie erreichen? Das scheint eine Menge Code zu sein, um nicht viel zu tun. – Pointy

+0

Ich arbeite an einer Anwendung, die flexibel genug ist, um auf eine Vielzahl von Daten zu reagieren, die alle auf völlig unterschiedliche Weise interpretiert, angezeigt und interagiert werden müssen. Das Einrichten einer netten Schnittstelle macht es für mich einfacher, das Codeverhalten für bestimmte Objekte später zu ändern, ohne zurückgehen zu müssen und andere Objekte wie einen "ObjectManager" neu zu faktorisieren. Ich möchte nicht, dass mein Code davon ausgeht, dass er weiß, dass er ein 'firstObject' oder ein 'secondObject' erstellen wird, also ist es kein Objekt für mich, hart zu codieren. – John

Antwort

4

Unter der Annahme, ich verstehe Ihr Wunsch (und ich bin mir nicht sicher, ob ich das tue) können Sie das globale Objekt window in DOM 0-Browsern verwenden oder einen eigenen Verweis auf den globalen Gültigkeitsbereich erstellen und diesen verwenden, um lokal definierte Variablen nachzuschlagen.

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

var objName = "firstObject"; 
var instance = new $global[objName]; 
+0

Warum ist das besser als 'var instance = new firstObject();' ?? Ich verstehe die ursprüngliche Frage nicht, denke ich. – Pointy

+0

@Pointy Da die ursprüngliche Frage gestellt wurde, wie man eine Liste von "Objekt" -Namen durchläuft und daraus neue Instanzen erstellt. – Phrogz

+1

Oh, OK. Ich schätze, ich verstehe immer noch nicht den ganzen Punkt hier, aber was Sie sagen, macht Sinn, denke ich. – Pointy

7

Dieses:

var dynamicallyCreateObject = new [type](); 

ist fast richtig, außer dass Sie ein äußeres Objekt Zugriffseigenschaften benötigen. Im Fall, dass Ihre Konstrukteure global sind, können Sie window verwenden:

var dynamicallyCreateObject = new window[type](); 

Idealerweise sollten sie in Ihrem eigenen Namensraum sein, in diesem Fall können Sie etwas Ähnliches tun:

var dynamicallyCreateObject = new MyNamespace[type](); 
Verwandte Themen