2011-11-04 25 views
5

yo quiero ser capaz de hacer esto:Javascript: Configuración de las propiedades del objeto

var user1 = { 
    name: 'John', 
    gender: 'male' 
} 


var user2 = { 
    name: 'James', 
    gender: 'male', 
    email: '[email protected]' 
} 

user1.someSetMethod({email: '[email protected]'}); 
user2.someSetMethod({name: 'Jenny', gender: 'female'}); 

Resultado deseado:

var user1 = { 
    name: 'John', 
    gender: 'male', 
    email: '[email protected]' 
} 


var user2 = { 
    name: 'Jenny', 
    gender: 'female', 
    email: '[email protected]' 
} 

Quiero un método que va a establecer los atributos de acuerdo a lo que es pasó a la función. Es que el atributo no existe Quiero que se cree, si lo hace, quiero que se sobrescriba.

¿Existe un método como este en Javascript?

+0

jQuery tiene un muy buen método de extender: http://api.jquery.com/jQuery.extend/ –

Respuesta

6

Este es normalmente llamado extendiendo tu objeto. Prácticamente todas las bibliotecas de JavaScript tienen su propio método para hacer esto. O puede escribir el suyo en unas pocas líneas de código.

Utilizando el método de jQuery, usted lo haría así:

var user1 = { 
    name: 'John', 
    gender: 'male' 
}; 

$.extend(user1, { 
    email: '[email protected]' 
}); 

user1.email === '[email protected]'; //true 
+4

O en JS simple: ' var user1 = {name: 'John', gender: 'male'}; user1 ["email"] = "[email protected]"; ' – mcmlxxxvi

3

No, usted no quiere hacer esto.

La única forma de agregar un método a todos los objetos es ampliar Object.prototype.

Hacerlo (en navegadores ES3 como IE8) tiene como consecuencia la adición de propiedades a las enumeraciones.

Por ejemplo:

Object.prototype.extend = function (o) { 
    // clone properties of o into this 
}; 

var someObj = {}; 
for (var key in someObj) { 
    console.log(key); // "extend" 
} 

Lo mejor que puede hacer es usar Object.extend

Object.extend(user2, { 
    name: "Jenny", 
    gender: "female" 
}); 

pd tiene una implementación de extend o puede utilizar:

Object.extend = function (target, source) { 
    for (var key in source) { 
    target[key] = source[key]; 
    } 
}; 
+0

@pagewil: \ te lo estoy diciendo lo que quiere No se puede hacer de manera sensata, pero puedes usar una alternativa. – Raynos

+0

Gracias, esto es más detallado :) – wilsonpage

+0

Realmente lo estoy requiriendo en un contexto NodeJS, debería haber mencionado antes realmente. – wilsonpage

2

Si está dispuesto a usar jquery, puede usar su método extend, junto con algunos valores predeterminados que garantizarán que todas las propiedades que desea estén configuradas correctamente.

Algo como esto:

function whatever(obj1) { 
    var defaults = { 
     name: 'Foo Bar', 
     email: '[email protected]', 
     gender: 'male' 
    }; 

    return $.extend(defaults, obj1); 
} 
Cuestiones relacionadas