Классы CoffeeScript работают не так. Когда вы говорите такие вещи, как:
class C
helpers:
f: -> console.log(@)
helpers
будет только объект присоединен к прототипу C
«s. Там не будет никакого специального крепления к C, так это:
c = new C
c.helpers.f()
так же, как:
c = new C
h = c.helpers
h.f()
и оба сбросят helpers
себя в консоли.
Вы не можете использовать =>
, чтобы помочь что-нибудь здесь, потому что, опять же, helpers
- это объект, не имеющий специального подключения к C
. Так что если вы попытаетесь это сделать:
class C
helpers:
f: => console.log(@)
c = new C
c.helpers.f()
вы получите C
себя в консоли. Это происходит потому, что f
- это просто функция внутри объекта, прикрепленного к прототипу C
, f
на самом деле не является методом.
Существует несколько способов обойти это.
Избавьтесь от helpers
полностью и использовать =>
:
class Test
constructor: -> @vir = ""
func1: => @vir = "a"
t = new Test
f = t.func1
f() # @ is what you expect it to be
BIND все функции внутри helpers
при создании нового экземпляра:
class Test
constructor: ->
@vir = ""
helpers = { }
helpers[name] = f.bind(@) for name, f of @helpers
@helpers = helpers # Be careful not to mess up the prototype
helpers:
func1: -> @vir = "a"
t = new Test
f = t.helpers.func1
f()
Bind функции, когда вы отправьте их на вашу систему обработки событий:
class Test
constructor: -> @vir = ""
helpers:
func1: -> @vir = "a"
t = new Test
whatever.on('some-event', t.helpers.func1.bind(t))
Сообщите системе обработки событий, что должно быть @
. Некоторые системы событий позволяют указать, что this
использовать при вызове обработчиков событий, я не знаю, что управляет вашими событиями, поэтому это может быть или не быть применимым.
class Test
constructor: -> @vir = ""
helpers:
func1: -> @vir = "a"
t = new Test
whatever.on('some-event', t.helpers.func1, t) # Assuming your event system understands a "context" argument
Есть, конечно, и другие способы обойти это, но я думаю, что выше являются наиболее общими подходами.