2011-12-21 66 views
1

我有對象字面什麼,我認爲是基本對象:的JavaScript - 添加屬性對象常量和返回

var obj = { 
    key1 : 'value1', 
    key2 : 'value2' 
} 

,並想使用這個對象,並通過它與extention的功能就像

myFunction(obj + { key3 : 'value3' }); 

// param became: 
{ 
    key1 : 'value1', 
    key2 : 'value2', 
    key3 : 'value3' 
} 

myFunction(obj + { key2 : 'new value2' }); 

// param became: 
{ 
    key1 : 'value1', 
    key2 : 'new value2' 
} 

+運營商是不是它是正確的。我如何做到這一點?這是一種方式嗎?

編輯:你想永久改變obj? - 不,我希望能夠重新使用它作爲基地的下一個呼叫。

回答

5

如果您能夠接受改變obj,只是改變它,你通過它之前:

var obj = { /* stuff */ }; 

obj.key3 = 'value3'; 
myFunction(obj); 

你想永久改變OBJ? - 不,我希望能夠重新使用它作爲基地的下一個呼叫。

好了,所以你需要make a copy of obj,並改變副本 - 要麼你打電話之前myFunction

var obj = { /* stuff */ }; 
var extension = {key3: 'value3'}; 

myFunction($.extend({}, obj, extension)); 

或通過obj和 「延伸」 到myFunction

var obj = { /* stuff */ }; 
var extension = {key3: 'value3'}; 

myFunction(obj, extension); 

並有myFunction做的工作:

function myFunction(base, ext) 
{ 
    if (typeof base === 'object' && typeof ext === 'object') 
    { 
     base = $.extend({}, base, ext); 
    } 

    // rest of the function logic here 
} 

如果你已經(或不介意)使用jQuery,$.extend()將是你最好的任務。

+0

你想永久改變obj嗎? - 不,我希望能夠重新使用它作爲基地的下一個呼叫。 – bensiu 2011-12-21 22:42:24

0

您可以創建一個無損擴展對象(不是「延長」,真的,只要從另外一個新的對象)的功能,例如:

var oldObj = {name: 'foo'}; 

function extendNonDestructive(src, newProps) { 
    function F() {} F.prototype = src; 
    var newObj = new F; 
    for (var p in newProps) { 
    if (newProps.hasOwnProperty(p)) { 
     newObj[p] = newProps[p] 
    } 
    } 
    return newObj 
} 

var newObj = extendNonDestructive(oldObj, {lastName: 'bar'}); // Doesn't touch oldObj 

注意:您可能會感興趣的Object.create其中比小的「函數F(){}; F.prototype = src;」在我的代碼中,但它是ES5 +。

+0

這幾乎就是'$ .extend'所做的 - 只是沒有jQuery';-)' – 2011-12-22 03:50:44

+0

並且不改變原文。我不知道他使用的是jQuery – Alexander 2011-12-22 04:47:04

+0

關於jQuery的完全有效的觀點,儘管'.extend()'不需要改變原來的東西,只是通過'{}'作爲第一個參數。在意識到這是必要的之後,我編輯了我的答案。 – 2011-12-22 04:51:41