2010-11-18 10 views
3

I ont deux objets définis quelque chose comme ceci (simplifié pour l'amour de la question):Meilleure façon de créer dynamiquement de nouveaux objets en JavaScript?

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

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

Ensuite, j'ai un gestionnaire d'objets qui fonctionne comme une sorte d'interface pour mon application principale pour créer des objets:

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

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

Enfin un exemple de l'application principale à l'aide du gestionnaire d'objets à dynamiquement Créer Soit firstObjects ou 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 
    } 
}; 

Cette approche fonctionne très bien, mais a un inconvénient que je peux voir - étant que vous devez définir formellement le nom de la fonction constructeur pour chaque "Type" d'objet qui pourrait être créé. Dans le cas où je voulais créer un "thirdObject" - qui serait déjà formellement défini - je devrais également revenir en arrière et ajouter une référence à la fonction constructeur de "thirdObject" dans le ObjectManager.

Idéalement, je voudrais supprimer la nécessité d'un « ObjectManager » et tout simplement être en mesure d'appeler dynamiquement la méthode constructeur avec le « nouveau » mot-clé comme ceci:

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

Quelqu'un a des idées sur un meilleure façon de gérer dynamiquement la création de différents objets en JavaScript en utilisant le "nouveau" mot-clé?


En réponse à certains commentaires initiaux:

Je aurais dû mentionner que l'application entière est enfermée dans une fonction anonyme.

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

@casablanca: D'après ce que vous dites, je crois que je vais devoir définir en fait un namespace à l'intérieur toute fonction anonyme, car une fois qu'il se termine, je n'ai aucun moyen réel de se référer directement à cette portée à nouveau. Je pense que je sais ce que je dois faire maintenant, j'espérais qu'il y avait une autre façon de travailler avec ce «nouveau» mot-clé - mais cela ne semble pas être le cas.

+1

Qu'essayez-vous d'accomplir? Cela ressemble à énormément de code pour ne rien faire. – Pointy

+0

Je travaille sur la création d'une application suffisamment flexible pour répondre à une variété de données qui devront toutes être interprétées, affichées et interagies de manière complètement différente. Mettre en place une interface sympa comme celle-ci me permet de changer plus tard le comportement du code pour des objets particuliers, sans avoir à revenir en arrière et à recalculer d'autres objets, comme un "ObjectManager". Je ne veux pas que mon code présume qu'il sait qu'il va créer un 'premier objet' ou un 'second objet' si dur que ce n'est pas un objet pour moi. – John

Répondre

4

En supposant que je comprends votre désir (et je ne suis pas sûr de le faire) vous pouvez utiliser l'objet global window dans les navigateurs DOM 0, ou créer votre propre référence à la portée globale, et l'utiliser pour rechercher des variables définies localement.

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

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

Pourquoi est-ce mieux que 'var instance = new firstObject();' ?? Je ne comprends pas la question initiale, je suppose. – Pointy

+0

@Pointy Parce que la question initiale demandait comment parcourir une liste de noms 'objet' et en créer de nouvelles. – Phrogz

+1

Oh, d'accord. Je suppose que je ne comprends toujours pas tout le point ici, mais ce que vous dites est logique je suppose. – Pointy

7

Ce:

var dynamicallyCreateObject = new [type](); 

est presque correct, sauf que vous avez besoin d'un objet extérieur aux propriétés d'accès. Dans le cas où vos constructeurs sont globaux, vous pouvez utiliser window:

var dynamicallyCreateObject = new window[type](); 

Idéalement, ils devraient être au sein de votre propre espace de noms, dans ce cas, vous pouvez faire quelque chose de similaire:

var dynamicallyCreateObject = new MyNamespace[type]();