2015-01-27 3 views
1

Как following example, я хотел бы иметь вложенные методы в класс coffescript (или собственный js).Вложенные методы в coffescript

class Child 
    constructor: (@id) -> 
    console.log "new child #{@id}" 
    animations: 
    start: -> 
     console.log @, "#{@id} start animation" 
    custom: 
     rotate: -> 
     console.log @, "#{@id} custom rotate animation" 

class Parent 
    constructor: -> 
    @_childs = [] 
    _.each [1..10], (index) => 
     @_childs.push new Child(index) 
    startAll: -> 
    _.each @_childs, (child) -> 
     child.animations.start() 


parent = new Parent() 
parent.startAll() 

Единственный способ я нашел, чтобы

  1. Clone мои вложенные методы объекта
  2. BIND каждый вложенными методы к моему текущему объекту

Я предпочел бы держать его в мой объект-прототип, чтобы избежать воссоздания всех вложенных методов при создании нового объекта. Я нашел ответ here, но у меня не было хорошего способа справиться с этим. Я также нашел answer, это единственный способ сделать это?

Thx для вашей помощи

+0

Лучше всего не использовать вложенные методы, это боль, чтобы отслеживать «это». Я просто назвал бы метод в имени функции, например 'animationStart'. – elclanrs

+0

Я понимаю вашу точку зрения, и вы, вероятно, правы, но я нахожу это немного печальным: «В javascript, это боль, чтобы отслеживать это», поэтому давайте просто изменим имя метода »:( –

ответ

1

Если вы сделаете функции вместо объектов вы можете отслеживать this:

class Child 
    constructor: (@id) -> 
    console.log "new child #{@id}" 
    animations: -> 
    start: => 
     console.log @, "#{@id} start animation" 
    custom: -> 
     rotate: => 
     console.log @, "#{@id} custom rotate animation" 

Тогда просто вызовите функцию, которая будет возвращать объект.

child.animations().start() 
+0

Вы правы , Я окончательно могу это сделать. Я просто подожду несколько минут, прежде чем принимать ваш ответ, чтобы узнать, есть ли у кого-то другой ответ :) Thx много в любом случае –

Смежные вопросы