2011-11-04 104 views
5

我希望能够做到这一点:的Javascript:设置对象属性

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

期望的结果:

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


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

我想这将按照什么是设置属性的方法传入函数。该属性是否存在我希望它被创建,如果有,我希望它被覆盖。

像这样的方法存在于Javascript中吗?

+0

jQuery有一个很不错的扩展方法:http://api.jquery.com/jQuery.extend/ –

回答

6

这通常是称为扩展为你的对象。实际上,每个JavaScript库都有自己的方法来执行此操作。或者你可以用几行代码编写自己的代码。

使用jQuery的方法,你会做它像这样:

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

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

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

或者纯JS: 'var user1 = {name:'John',gender:'male'}; user1 [“email”] =“[email protected]”;' – mcmlxxxvi

3

不,你不想这样做。

将方法添加到所有对象的唯一方法是扩展Object.prototype

这样做(在IE8等ES3浏览器中)会导致向枚举添加属性。

例如:

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

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

你能做的最好是使用Object.extend

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

pdextend的实现,也可以使用:

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

@pagewil:\我要告诉你,你想要什么做不了明智的事情,但你可以使用另一种方法。 – Raynos

+0

感谢这是更详细的:) – wilsonpage

+0

我实际上需要它在一个NodeJS上下文中,真的应该早些提到。 – wilsonpage

2

如果你愿意使用jQuery,你可以使用它的扩展方法,以及一些默认设置,以确保你想要的所有属性设置正确。

事情是这样的:

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

    return $.extend(defaults, obj1); 
}