2014-12-26 2 views
0

Внутри моего класса у меня есть объект (просто чтобы поместить все связанные функции для удобства), поэтому я называю их «этой» точкой для текущего объекта.«this» внутри объекта в классе сценария кофе

Например:

 
class Test 
    constructor: -> 
     @vir = "" 

    helpers: 
     func1: -> 
      @vir = "a" (I can't do it because this point to object "func1") 
     func2: -> 

На самом деле, я могу передать свой корневой объект (или ту глобальную переменную) в качестве параметра, но я хочу знать сценарий, как кофе, может быть, есть еще один способ, как «=>» для событий?

ответ

1

Классы 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 на самом деле не является методом.

Существует несколько способов обойти это.

  1. Избавьтесь от helpers полностью и использовать =>:

    class Test 
        constructor: -> @vir = "" 
        func1: => @vir = "a" 
    t = new Test 
    f = t.func1 
    f() # @ is what you expect it to be 
    
  2. 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() 
    
  3. Bind функции, когда вы отправьте их на вашу систему обработки событий:

    class Test 
        constructor: -> @vir = "" 
        helpers: 
         func1: -> @vir = "a" 
    t = new Test 
    whatever.on('some-event', t.helpers.func1.bind(t)) 
    
  4. Сообщите системе обработки событий, что должно быть @. Некоторые системы событий позволяют указать, что 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 
    

Есть, конечно, и другие способы обойти это, но я думаю, что выше являются наиболее общими подходами.