2013-08-01 134 views
3

我明顯不明白關於JS對象的東西。Javascript對象和嵌套

http://jsfiddle.net/q3SCF/2/

function baseObject() { 
    var self = this; 

    self.value = "value"; 
    self.nestedObject = function() { 
     var nest = this; 

     nest.value = self.value; 
     nest.deepNest = function() { 
      var deep = this; 

      deep.value = nest.value; 
      deep.selfValue = self.value; 
     }; 
    }; 
    self.nestedObject2 = { 
     value: self.value, 
     deepNest: { 
      value: this.value, 
      selfValue: self.value 
     } 
    }; 
} 

我會打破小提琴,並設法使我的問題清楚。

我對JS對象的理解是,當通過值傳遞時,當一個對象設置爲與另一個對象相等時,它們都應該指向相同的值,以便在更新原始對象時,設置的對象等於它會更新。

參見:Javascript pointer/reference craziness. Can someone explain this?

首先,我沒有看到這種情況發生(而這正是我希望發生的)。但即使是陌生人,當我更改基礎對象時,如果它們嵌套得足夠深,實際上這些值會變爲NULL。請幫助。我顯然缺少一些東西。

爲了防止您的JS引擎執行與我的不同的操作,我的計算機上會顯示結果(Windows 7在Chrome中運行)。

All Deeply Nested Values turn to Null, and the Original value is the only value that changes

+0

您可以使用對象操場上玩耍:http://www.objectplayground.com/ –

回答

1

我對JS對象的理解是,儘管通過通過值,當一個對象被設置爲等於另一個時,它們都應該指向相同的值,以便當原始對象被更新時,那麼被設置爲等於它的對象將被更新。

Javascript按參考值複製參考。在你的例子中,所有變量都保存着對原始文件self.value的複製引用。當你分配一個新值self.value只有該變量將持有對該新值的引用。所有其他人仍將指向舊的參考。

您可以使您的方案工作的唯一方法是創建一個對象self.value並閱讀屬性。當這個屬性改變時,不會引用原始對象。

http://jsfiddle.net/q3SCF/13/

function baseObject() { 
    var self = this; 

    self.value = {p:"value"}; 
    self.nestedObject = function() { 
     var nest = this; 

     nest.value = self.value; 
     nest.deepNest = function() { 
      var deep = this; 

      deep.value = nest.value; 
      deep.selfValue = self.value; 
     }; 
    }; 
    self.nestedObject2 = { 
     value: self.value, 
     deepNest: { 
      value: this.value, 
      selfValue: self.value 
     } 
    }; 
} 
+0

哇,很好,謝謝。仍然沒有解釋爲什麼當另一個對象時嵌套對象不會改變,但它解釋了空值。 – deltree

+0

更新我的回答是一個實際的答案:) – Bart

+0

壯觀。非常感謝。 – deltree

2

顯示代碼/標記是錯誤的。

您可以簡單地使用console.log(object)隨時查看對象結構。 (第一級,當你展開對象,你會看到結構在擴張的時候。)

例如:

Console

+0

這對我來說並不實用。我知道如何使用console.log,我正在構建一個簡潔的例子。 – deltree

+0

@deltree,這指出你的問題中的錯誤,並顯示真正發生了什麼。提示:儘可能減少問題和代碼,以重現您遇到的問題。到底什麼是你期望的結果是在變化之後?對象通過引用傳遞。 – Qtax