2011-04-28 160 views
2

我的問題很簡單,我想,但我找不到一個簡單的解決方案。這裏是例子:JavaScript傳遞變量作爲值而不是作爲參考

var obj1 = { 
    m1:"a", 
    m2:"b" 
}; 

var obj2 = { 
    m:obj1 
}; 


obj2.m.m1 = "c"; 


document.write(obj2.m.m1+"<br>"); //output: c 

document.write(obj1.m1+"<br>"); // output: c (I wanted to be a) 

所以..我需要做什麼才能從obj1.m1返回「a」?

預先感謝

+0

[JavaScript的如何創建參考]的可能重複(http://stackoverflow.com/questions/5823870/javascript-how-to-create-reference) – Quentin 2011-04-28 19:59:46

+0

@大衛Dorwad其實我在尋找的相反的事情。如何將對象作爲值傳遞而不是作爲參考 – 2011-04-28 20:02:48

回答

6

您需要將obj2.m設置爲obj1的克隆,而不是obj1本身。例如:

function clone(obj) { 
    var result = {}; 
    for (var key in obj) { 
     result[key] = obj[key]; 
    } 
    return result; 
} 

var obj2 = { 
    m: clone(obj1) 
}; 

obj2.m.m1 = "c"; // does not affect obj1.m1 
+0

請注意,我特別/不/將'clone'函數附加到'Object.prototype',因爲那是一般,一個非常糟糕的想法。另外,這是一個克隆函數的一個非常簡單的實現;對於更完整的一個,請查看jQuery.extend的實現。 – 2011-04-28 20:17:09

4
+0

這是一篇很棒的文章,感謝您的分享! – Andre 2011-04-28 20:05:59

+3

請注意,增加Object對象是一個非常糟糕的主意,因爲它除非仔細篩選原型,否則會中斷for for的使用。請參閱:http://erik.eae.net/archives/2005/06/06/22.13.54/ – 2011-04-28 20:10:53

1

obj1obj2.m指向相同對象。您不能有obj1.m1 != obj2.m.m1

您可以做的是將obj1的副本分配給obj2.m。查看將發佈的鏈接。

0

您需要首先克隆它。

Object.prototype.clone = function() { 
    var newObj = (this instanceof Array) ? [] : {}; 
    for (i in this) { 
    if (i == 'clone') continue; 
    if (this[i] && typeof this[i] == "object") { 
     newObj[i] = this[i].clone(); 
    } else newObj[i] = this[i] 
    } return newObj; 
}; 

var obj1={ m1:"a", m2:"b" }; 
var obj2={ m: {}}; 
obj2.m = obj1.clone(); 
obj2.m.m1="c"; 
document.write(obj2.m.m1+"<br>"); 
document.write(obj1.m1+"<br>");