es posible hacer algo como esto sin eval mal:crear objeto desde classname dinámico - ReflectionClass en JS?
var str='MyClass';
eval('new '+str);
Me acabo de enterar de que hay ReflectionClass en PHP ... gracias.
es posible hacer algo como esto sin eval mal:crear objeto desde classname dinámico - ReflectionClass en JS?
var str='MyClass';
eval('new '+str);
Me acabo de enterar de que hay ReflectionClass en PHP ... gracias.
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"
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();
};
'eval()' == malo. –
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'. –
@ElliotB. En ese caso, puede usar 'this' para hacer referencia al alcance actual. a la 'new this [className]' –
+1 Parece carente de maldad para mí. – user113716
perfecto, gracias! EDITAR: ooh, y puedo poner las definiciones de clase en un objeto, en lugar de usar el objeto ventana ... – kubi