2011-02-17 29 views

Respuesta

19

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.

+0

Gracias hombre, esto funcionó muy bien para mí! – unjuken

4

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); 
+0

Algo me dice que esto será cuatro veces más rápido que la respuesta aceptada. –

+0

¿Puedes codificar un ejemplo? No lo entiendo .. – inetphantom

+0

@inetphantom el primero o el segundo? –

-1

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);

Cuestiones relacionadas