2013-03-13 72 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