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.
Qu'essayez-vous d'accomplir? Cela ressemble à énormément de code pour ne rien faire. – Pointy
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