2011-02-22 6 views

Respuesta

22

Usted podría intentar esto:

var str = "MyClass"; 
var obj = new window[str]; 

He aquí un ejemplo:

function MyClass() { 
    console.log("constructor invoked"); 
} 

var s = "MyClass"; 
new window[s]; //logs "constructor invoked" 
+4

+1 Parece carente de maldad para mí. – user113716

+3

perfecto, gracias! EDITAR: ooh, y puedo poner las definiciones de clase en un objeto, en lugar de usar el objeto ventana ... – kubi

5

Crear objeto (invocar el constructor) a través de la reflexión:

SomeClass = function(arg1, arg2) { 
    // ... 
} 

ReflectUtil.newInstance('SomeClass', 5, 7); 

e implementación:

/** 
* @param strClass: 
*   class name 
* @param optionals: 
*   constructor arguments 
*/ 
ReflectUtil.newInstance = function(strClass) { 
    var args = Array.prototype.slice.call(arguments, 1); 
    var clsClass = eval(strClass); 
    function F() { 
     return clsClass.apply(this, args); 
    } 
    F.prototype = clsClass.prototype; 
    return new F(); 
}; 
+6

'eval()' == malo. –

+3

Es * solo * malo si no valida correctamente que la cadena sea 'eval'ed. Aparte de eso, esta respuesta es genial. La respuesta * aceptada actualmente solo * funciona si la clase es accesible globalmente (es decir, en el nivel de la ventana). Las clases definidas dentro de cierres, por ejemplo, no se pueden instanciar usando el método 'window'. –

+0

@ElliotB. En ese caso, puede usar 'this' para hacer referencia al alcance actual. a la 'new this [className]' –

Cuestiones relacionadas