2011-11-04 103 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); 
}