2015-08-24 9 views
0

Я написал следующий код:класса дочерние функции относятся к родителю

class TheClass 
    children: [] 
    addChild: (argone, argtwo) -> 
    pos = @children.push new TheClass argone, argtwo 
    @children[pos - 1] 
    iterateChildren: -> 
    console.log @children 
    for child in @children 
     child.iterateChildren() 
    constructor: (@argone, @argtwo) -> 

a = new TheClass 1,1 
b = a.addChild 2,2 
c = a.addChild 3,3 
ba = b.addChild 4,4 
ca = c.addChild 5,5 
a.iterateChildren() 

Класс имеет одну функцию, чтобы добавить дочерний объект и одну функцию для перебора его детей, говоря им сделать то же самое.

В отличие от моих ожиданий, этот код неоднократно вызывает метод iterateChildren(), а не его дочерние элементы, что приводит к тому, что дочерний массив печатается бесконечно.

Что я сделал не так, и как я могу это исправить?

ответ

1

В свойствах, указанных в определении class, прилагается прототип, а не каждый отдельный экземпляр. Это означает, что это:

class TheClass 
    children: [] 

создает только один children массива, который будет использоваться совместно все экземплярами. Так что ваш класс более или менее эквивалентно следующему:

children_array_for_everyone = [ ] 
class TheClass 
    addChild: (argone, argtwo) -> 
    pos = children_array_for_everyone.push new TheClass argone, argtwo 
    @children[pos - 1] 
    iterateChildren: -> 
    console.log children_array_for_everyone 
    for child in children_array_for_everyone 
     child.iterateChildren() 
    constructor: (@argone, @argtwo) -> 

Если вы хотите, чтобы каждый экземпляр, чтобы иметь свой собственный @children (и вы хотите это), затем создать массив в конструктор:

class TheClass 
    # No children here 
    #... 
    constructor: (@argone, @argtwo) -> 
    @children = [ ]