2011-12-26 71 views
1

JavaScript通過引用而不是逐字地複製對象。例如:通過引用複製對象是否有實際用途?

var myObject = {}; 
var myCopy = myObject; 

myObject.foo = "bar"; 

alert(myCopy.foo); //alerts "bar" 

但我真的努力想實際的,現實世界的原因除了爲開發人員提供一種方法,使代碼稍微更具可讀性(你可以爲同一對象不同的名字給不同的用途)。

最有可能的是我錯過了這個觀點,所以任何人都可以告訴我那是什麼意思?

+2

對於此行爲,我不會使用「複製」一詞。您只需將兩個變量分配給同一個對象的引用;這與將數字5分配給兩個變量沒有什麼不同。我無法想象你會用這種語言做什麼來做這樣的任務*不可能。 – Pointy 2011-12-26 22:47:12

回答

4

寫作後:

var myObject = {}; 

有對象了在內存中的地方,你可以通過名字myObject參考。以下分配:

var myCopy = myObject; 

...說myCopy現在指的是同一個對象,無論它可能是。這是當你給一個參數的函數發生同樣的事情:

function somefunc(localName) { 
    // body 
} 
someFunc(myCopy); 

現在有一個叫做localName變量,當地someFunc也指內存相同的對象了。

這是我們傳遞對象引用的基本方式,以便它可以在不同範圍內以不同名稱引用。

我們可能將整個結構複製到內存中的新位置。沒有什麼能夠阻止設計師創造出這樣的語言。但效率不高 - 想想深度嵌套的對象 - 通常不是你想要做的。例如,如果一個函數修改了一個對象的一個​​屬性,那麼它將需要返回整個對象以使該更改持久存在於該函數之外。調用者需要處理該返回值,決定是否需要保留舊對象,或者新創建的稍微不同的副本是否可以覆蓋它。

同樣,原則上這個設計方向沒有錯;這不僅僅是JavaScript的設計。

1

這取決於;在你的情況下,它可能相當混亂,因爲它沒有達到真正的目的。然而,用於向對象較長的路徑也可以是有利的是將對象存儲在一個單獨的變量,因爲它需要使用該對象,如在此實例中的每個語句少打字:

var style = document.getElementById("foo").style; 

style.color = "red"; 
style.font = "sans-serif"; 
// ... 
0

我的意見(並且僅此而已)是通過引用創建對象(而不是複製)通常更有用,並且用戶想要的是什麼。如果將對象作爲參數傳遞給方法,則(幾乎總是)對該對象正在處理和更改的對象感興趣,而不是通過處理副本(並保留原始對象)。很顯然,在某些情況下,這不是真的,有選擇的選擇會很高興,但我無法想起自己希望能夠將一個對象副本傳遞給一個方法,並且通常非常感激我正在處理的事情是事情。