2011-12-21 9 views
1

を返す:javascriptの - 私はベースオブジェクトとして考えるものオブジェクトリテラルを持つオブジェクトリテラルにプロパティを追加し、

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

をし、このオブジェクトを使用して

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

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' ;-)なし ' –

+0

オリジナルを変更せずに。そして、私は彼がjQueryを使っているのを知らないのです。 – Alexander

+0

'$ .extend()'はオリジナルを変更する必要はありませんが、最初の引数として '{}'を渡すだけです。私は必要なことを理解した後、私の答えを編集しました。 –

関連する問題