2011-01-04 6 views
9

En Javascript, comment instancier dynamiquement une nouvelle classe sans utiliser eval() et passer un argument? Par exemple, disons que je veux créer un nouveau CatViewController et passer en "chaton", comment le ferais-je?instancier la classe dynamique

var myClassname = "CatViewController"; 
var cat = new myClassname("kitten"); 

Il devrait se résoudre à:

var cat = new CatViewController("kitten"); 

Merci!

+1

Vous devrez montrer comment et où la fonction constructeur est définie afin que @Chaos donne une réponse plus précise. Ses exemples génériques montrent généralement comment cela fonctionnerait. – user113716

Répondre

8

Tant que la fonction est à la portée que vous pouvez faire ceci:

var cat = new this[myClassname]("kitten"); 

Une autre façon similaire:

var classes = { 
    A: function (arg) { 

    }, 
    B: function (arg) { 

    }, 
    C: function (arg) { 

    } 
}; 

var a = new classes["A"]("arg"); 
+1

Cela ne fonctionnera que si 'this == window', et la var est dans la portée globale. –

+0

@Matthew - Ce n'est pas tout à fait correct. Il peut réellement fonctionner dans n'importe quelle portée mais il doit être défini dans ce périmètre. – ChaosPandion

+0

Et si vous l'instanciez dans une autre classe où this! = Window? – jaysonp

0

@Matthew - Si vous avez référence à la portée window vous devriez être bon aller, non? Il suffit d'utiliser la référence window au lieu du mot-clé this. Je semble travailler pour moi. Cependant, je suis très curieux de savoir s'il y a des inconvénients à cette approche puisque je l'utilise actuellement dans un projet. Here is a demo basé sur votre démo précédente.

Questions connexes