2013-10-05 47 views
-1

如果對象是通過引用傳遞,和函數是對象,那麼有人可以解釋這種現象:當對象被複制,而不是通過作爲參考」

function extendCopy(p){ 
    var c = {} 
    for (var i in p){ 
    c[i] = p[i]; 
    } 
    c.uber = p; 
    return c; 
} 
var shape = { 
    name: "shape"; 
    toString: function(){ return name; } 
} 
var twoDee = extendCopy(shape); 
twoDee.toString = function() { return "2d shape" } 

>>>shape.toString 
>>>function(){ return name; } 

爲什麼twoDee.toString不僅僅是shape.toString參考?當然複製函數中的行c[i] = p[i];只會將新對象的屬性設置爲對複製對象中相同屬性的引用?

編輯

這可以簡化爲:

爲什麼會出現這種回報"test"而不是"modified"如果函數是對象和對象按引用傳遞?是因爲我實際上完全用第3行中的新對象替換了「對象」(函數)?

a.toString = function(){ return "test" }; 
b.toString = a.toString; 
a.toString = function(){ return "modified" }; 
b.toString(); 
>>> "test" 
+1

這個例子是錯誤的; 「約翰」得到迴應。顯示真實的代碼。 – raina77ow

+0

哦,你是對的,讓我調整 –

+0

如果它使用緩存,偶爾會在控制檯中看到錯誤的結果 –

回答

1

複製作爲對象引用的屬性值僅複製引用。它不會導致值的接收者成爲對其他屬性的引用。

例子:

var a = { x: { name: 'John' } }; 
var b = {}; 

b.x = a.x; // b.x points to the same object as a.x; 

a.x = { name: 'Peter' }; // a.x points to a different object, b.x is unchanged 

當您複製從a.x價值爲b.xb.x的價值是相同的對象a.x指着一個參考,它不是a.x自身的引用。

功能參考也是如此。當您複製函數的參考時,只能複製參考值。如果原始文件被不同的參考替換,它不會更改從中複製的值。

+0

謝謝,我發現這個問題真的很難說出來(因此有人倒下了!),但你已經完美地解決了你的答案。這使得現在很有意義! –

相關問題