2009-08-01 5 views
1

Cela peut ne pas être possible (ou peut-être mort facile :)!) Si elle est ici ...Type d'objet déterminé lors de l'exécution - Javascript (ExtJS)

Je veux être en mesure de créer des objets d'un type Cela dépend d'un ensemble de variables, sans avoir besoin d'une grosse instruction switch.

je pense qu'il est possible en PHP pour faire quelque chose comme ...

$objectType = "myNewClass"; 
$newObject = new $objectType(); 

où la variable $ newObject tiendra une instance de la classe "myNewClass".

Est-ce (ou une technique similaire) possible avec Javascript?

Merci Stuart

Répondre

4

Si vos fonctions de constructeur sont définies dans la portée globale, vous pouvez y accéder cuvette la notation de support (fenêtre [fnName]):

function ObjectType1(){ // example constructor function 
    this.type = 1; 
} 


var objectType = 'ObjectType1'; // string containing the constructor function name 

var obj = new window[objectType](); // creating a new instance using the string 
            // variable to call the constructor 

Voir: Member Operators

+0

Merci beaucoup! Cela a fonctionné un régal. La seule modification pour les personnes qui pourraient visiter cela dans le futur est celle dans le contexte ExtJS si vous changez le "objet" à l'espace de noms ExtJS qui est utilisé. par exemple. "var obj = new Ext.ux ['monObjet']();" Merci encore! – Stuart

-2

Devrait être faisable en utilisant eval():

var obj = eval("new " + objectType + "()"); 
+0

-1 pour code paresseux et dangereux. –

+1

Pour le bénéfice de chacun d'entre nous, pourriez-vous élaborer sur la façon dont ce code est paresseux, et comment est-ce dangereux? – Zed

1

La réponse de CMS est bonne, mais dans EXT vous avez probablement affaire à des espaces de noms.

je créer une carte d'objet qui détient toutes les classes dynamiques:

// within a namespace: 
var ns = { 
    Thinger: function(){} 
}; 

// globals: 
var Zinger = function(){} 

// map: 
var classes = { 
    zinger:Zinger, 
    thinger:ns.Thinger  
}; 

var type = "thinger"; 

var myClass = new classes[type](props, type, etc);