2011-04-30 26 views

Respuesta

29

Usted puede hacer algo como

function Person(){}; 
var name = 'Person'; 
var inst = new this[name] 

La clave es simplemente hace referencia al objeto que posee la función que es el constructor. Esto funciona bien en el alcance global, pero si está volcando el código dentro de una función, es posible que tenga que cambiar la referencia porque this probablemente no funcionará.

EDIT: Para pasar parámetros:

function Person(name){alert(name)}; 
var name = 'Person'; 
var inst = new this[name]('john') 
+0

+1 muy agradable meder – alex

+0

gracias! ¿cómo paso los parámetros? – yee379

+1

También puede usar 'apply' para pasar parámetros, lo que es útil si no los conoce con antelación, por ejemplo, 'this [name] .apply (null, args)' donde args es una matriz de parámetros/argumentos. Parece ser el caso más de las veces al llamar funciones de forma dinámica. –

6

Así es como lo hago. Similar a la respuesta de Meder.

var className = 'Person' 
// here's the trick: get a reference to the class object itself 
// (I've assumed the class is defined in global scope) 
var myclass = window[className]; 
// now you have a reference to the object, the new keyword will work: 
var inst = new myclass('params','if','you','need','them'); 
+0

inmensamente útil. Gracias. Y esto es mejor que la respuesta de Meder, porque puede pasar 'className' como un parámetro en una función primaria y, por lo tanto, usarla con cualquier clase debido al método de implicación. Al menos, la forma en que lo configuré. – BarryMode

-1

Tuve un problema similar en Node.js, cuando tuve que crear dinámicamente diferentes objetos de controlador dependiendo de los datos. Primero reuní todos los manejadores disponibles, que se implementaron como módulos separados, en un objeto. En un caso simple, esto podría ser codificado así.

var handlers = { 
    handlerX : require('HandlerX'), 
    handlerY : require('HandlerY') 
}; 

Entonces, cada vez que tenía que crear una instancia de un controlador, lo hice así:

var handlername = getHandlerName() 
var handler = new handlers[handlername](); 

Por supuesto, esto sólo funciona si usted sabe, o puede determinar mediante programación la lista de todos los objetos Va a necesito crear

0

mejorar en la respuesta anterior por meder:

Invocar mediante una función:

Usted simplemente reemplazar 'esto' con el alcance que contiene la clase que usted se refiere, por ejemplo, si la clase está escrito en el ámbito global como a continuación:

function Person(name){alert(name)}; 
var name = 'Person'; 

function classMaker(){ 
    var inst = new window[name]('john'); 
} 

classMaker(); 
Cuestiones relacionadas