Además de eval, ¿hay alguna otra forma de instanciar un objeto utilizando la lista de argumentos variables?Creación de instancias dinámicas en JavaScript
Ej: var foo = instantiate(className, [arg1, arg2, ...])
Además de eval, ¿hay alguna otra forma de instanciar un objeto utilizando la lista de argumentos variables?Creación de instancias dinámicas en JavaScript
Ej: var foo = instantiate(className, [arg1, arg2, ...])
Usted puede crear una instancia de un objeto con una lista de argumentos variable de la siguiente manera:
function instantiate(className, args) {
var o, f, c;
c = window[className]; // get reference to class constructor function
f = function(){}; // dummy function
f.prototype = c.prototype; // reference same prototype
o = new f(); // instantiate dummy function to copy prototype properties
c.apply(o, args); // call class constructor, supplying new object as context
o.constructor = c; // assign correct constructor (not f)
return o;
}
Nota al margen: es posible que desee pasar una referencia directa a la función constructor de la clase :
var foo = instantiate(Array, [arg1, arg2, ...]);
// Instead of:
var foo = instantiate("Array", [arg1, arg2, ...]);
... lo que lo hace compatible con no -funciones globales.
Usando Object.create() en ES5:
function instantiate(constructor, args) {
var instance = Object.create(constructor.prototype);
constructor.apply(instance, args);
return instance;
}
Utilizando el spread operator en ES6:
var foo = new constructor(...args);
Algo me dice que esto será cuatro veces más rápido que la respuesta aceptada. –
¿Puedes codificar un ejemplo? No lo entiendo .. – inetphantom
@inetphantom el primero o el segundo? –
Bueno siempre se puede hacer de la siguiente manera. Cualquier cosa añadida al prototipo de Dino se puede compartir entre los objetos instanciados. La diferencia con respecto al patrón de constructor normal es que los objetos instanciados no tienen que tener exactamente las mismas propiedades privadas establecidas. Se pueden establecer dinámicamente para cada uno de ellos.
function Dino(a,b){
for(i = 0; i< a.length; i++) this[a[i]] = b[i];
}
var props = ["foo", "bar"],
values = [42, 37],
obj = new Dino(props,values);
console.log(obj);
Gracias hombre, esto funcionó muy bien para mí! – unjuken