2013-03-13 74 views
1

所以我認爲我已經從javascipt範圍和原型區域的懸崖墜落。我試圖用對象構建一個簡單的樹結構。建樹不是問題,但是當我試圖讓所有的孩子們,我似乎無法將它們連接在一起。我已經走過了代碼,似乎有一些奇怪的範圍問題正在發生,我無法弄清楚。這是我的代碼:Javascript原型範圍和遞歸問題

var Foo = function (value) { 
    this.value = value; 
    this.children = []; 
} 

Foo.prototype.getAllChildren = function() { 
    var childs = []; 
    for (var i = 0; i < this.children.length; i++) { 
     childs.push(this.children[i]); 
     childs.concat(this.children[i].getAllChildren()); 
    } 
    return childs; 
}; 

var foo1 = new Foo(1), 
    foo2 = new Foo(2), 
    foo3 = new Foo(3); 

foo1.children.push(foo2); 
foo2.children.push(foo3); 

var children = foo1.getAllChildren(), 
    expected = foo1.children.concat(foo2.children); 

我創建了一個小提琴這裏顯示的代碼上面http://jsfiddle.net/e2zf8/1/

的結果getAllChildren功能只與一個富返回一個列表foo1時,它應該返回兩個Foo的列表。 (是的Foo是Foo的複數)。它似乎與遞歸,範圍和原型範圍有關。我似乎無法確定我的錯誤,任何幫助(或我的問題)都會有所幫助。

回答

3

不,沒有問題,也沒有與您的原型範圍。

只有array concat method不會修改它所應用的數組,但會返回連接的新數組。您的代碼保持不變,即childs。兩種可能性:

  • 使用childs = childs.concat(…)到,或者通過使用循環或[].push.apply(childs, this.children[i].getAllChildren())每次覆蓋childs新陣列
  • 每個getAllChildren的推到你的childs陣列。
+0

什麼是一個巨大的腦屁。我沒有意識到它只是返回一份副本。我認爲它像推動一樣運作。這實際上比我預期的要好。我肯定會使用覆蓋解決方案。它只是有點混淆,某些數組方法變異,有些則不變。 – Wilile 2013-03-13 17:13:08