2013-01-11 91 views
0

我有這段代碼,它將節點添加到數組然後更改它,firstNode對象設置在init函數中。javascript對象屬性指向另一個屬性

var myClass = function() { 
    this.items = [] 
    this.firstNodeValues = {}; 

    this.init = function() { 
     var firstIndex = false; 

     for (i = 10; i <= 15; i++) { 
      Node = {}; 
      Node.index = i; 
      Node.name = "undefined"; 
      if (i == 10) { 
       Node.name = "John" 
       this.firstNodeValues = Node; 
      } 
      this.items[i] = Node; 
     } 
    } 

    this.iterate = function() { 
     var newIndex = 10; 
     for (i = 10; i <= 15; i++) { 
      this.items[i].index = newIndex; 
      if (i == 10) { 
       this.items[i].name = "Michael"; 
      } 
      newIndex++; 
     } 
    } 
} 
var test = new myClass(); 
test.init(); 
console.debug(test.firstNodeValues.name) // this gives value "John" 
test.iterate(); 
console.debug(test.firstNodeValues.name) // this gives value "Michael" 

第二個調試返回"Michael"但是爲什麼?看起來firstNodeValues有一個指向節點items[10]的指針。
我希望如果我在firstTime中設置了FirstNodeValues,並且稍後改變了節點值,那麼firstNodeValues就不會改變並且保持與我第一次設置時完全相同。

回答

1

當你改變你的數據的克隆正在發生變化的原因是這樣的:

this.firstNodeValues = Node; 

在那裏,您聲明firstNodeValues是一個參考Node,不是複製。因此,您在firstNodeValues中更改的所有內容,更改爲Node,反之亦然。

你需要克隆的對象,像這樣:

function clone(obj){ 
    if(obj == null || typeof(obj) != 'object'){ 
     return obj; 
    } 

    var temp = {}; 

    for(var key in obj){ 
     if(obj.hasOwnProperty(key))){ 
      temp[key] = clone(obj[key]); 
     } 
    } 
    return temp; 
} 

然後,您可以複製節點,就像這樣:

this.firstNodeValues = clone(Node); 

這將確保this.firstNodeValues不對Node的引用,但是是一個新對象,具有與Node(所以,一個克隆)相同的屬性/值。

+0

請投下我的人請告訴我爲什麼?如果我犯了一個錯誤,我想從中吸取教訓。 – Cerbrus

-1

您可能也有興趣jQuery.extend()。所以:

this.firstNodeValues = $.extend({}, Node);

+0

jQuery本機JS問題的答案。 OP沒有要求JQ,似乎沒有使用它,而且答案並不能解釋他爲什麼會對它感興趣。 – Cerbrus

相關問題