2011-01-20 21 views
23

Tengo un constructor de JavaScript así:¿Pasar el objeto como parámetro a la función del constructor y copiar sus propiedades al nuevo objeto?

function Box(obj) { 
    this.obj = obj; 
} 

la que quiero pasar un objeto como un parámetro de la siguiente manera:

var box = new Box({prop1: "a", prop2: "b", prop3: "c"}) 

y me da algo como esto:

box.obj.prop1 
box.obj.prop2 
box.obj.prop3 

pero me gustaría que las propiedades estén directamente en el objeto como este:

box.prop1 
box.prop2 
box.prop3 

Sé que podría hacer algo como esto:

function Box(obj) { 
    this.prop1 = obj.prop1; 
    this.prop2 = obj.prop2; 
    this.prop3 = obj.prop3; 
} 

Pero eso no es bueno porque entonces mi constructor tendría que "saber" antes de que los nombres de las propiedades del parámetro del objeto. Lo que me gustaría es poder pasar diferentes objetos como parámetros y asignar sus propiedades directamente como propiedades del nuevo objeto personalizado creado por el constructor para obtener box.propX y no box.obj.propX. Espero ser claro, tal vez estoy midiendo algo muy obvio pero soy novato así que por favor necesito tu ayuda!

Gracias de antemano.

Respuesta

20

Puede hacer esto. Es probable que haya también una manera de jQuery ...

function Box(obj) { 
    for (var fld in obj) { 
    this[fld] = obj[fld]; 
    } 
} 

Puede incluir una prueba de hasOwnProperty si usted tiene (creo tontamente) extendida objeto

function Box(obj) { 
    for (var fld in obj) { 
    if (obj.hasOwnProperty(fld)) { 
     this[fld] = obj[fld]; 
    } 
    } 
} 

Editar

Ah ¡ja, ja! es jQuery.extend

Por lo tanto, el camino jQuery es:

function Box(obj) { 
    $.extend(this, obj); 
} 
+5

Una cosa observar que ninguna de las soluciones está haciendo una copia _deep_. Dependiendo de su implementación _actual_, existe la posibilidad de que surjan problemas. Por ejemplo, si en lugar de pasar su objeto de forma anónima crea una variable 'obj = {prop1: ..., propDanger: {a: 1, b: 2}}' y la pasa a su constructor 'var box = new Box (obj) ', luego edita a' obj.propDanger.a' también cambiará 'box.propDanger.a'. –

+1

@Brett Buen punto. Rara vez es un problema, pero es bueno saberlo para que no te sorprenda cuando ocurra. – Hemlock

7

En pocas palabras esto en su constructor

for (var prop in obj) { 
    if (obj.hasOwnProperty(prop)) { 
     this[prop] = obj[prop]; 
    } 
    } 
+0

Estoy dando la respuesta aceptada a @Hemlock porque lo recibió primero, ¡pero gracias de verdad! – VerizonW

2

He aquí un ejemplo con el patrón módulo javascript:

var s, 
NewsWidget = { 

    settings: { 
    numArticles: 5, 
    articleList: $("#article-list"), 
    moreButton: $("#more-button") 
    }, 

    init: function(options) { 
    this.settings = $.extend(this.settings, options); 
    s = this.settings; 
    this.bindUIActions(); 
    }, 

    bindUIActions: function() { 
    s.moreButton.on("click", function() { 
     NewsWidget.getMoreArticles(s.numArticles); 
    }); 
    }, 

    getMoreArticles: function(numToGet) { 
    // $.ajax or something 
    // using numToGet as param 
    } 

}; 

$(function(){ 
    NewsWidget.init({ 
    numArticles: 6 
    }); 

    console.log(s.numArticles); 
}); 
Cuestiones relacionadas