咖啡脚本课中的对象里面有“这个”

时间:2014-12-26 09:42:54

标签: coffeescript

在我的班级里面,我有对象(只是为了方便起见所有相关的功能),所以我称之为#34;这个"指向当前对象。

例如:

class Test
    constructor: ->
        @vir = ""

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

实际上,我可以将我的根对象(或全局变量)作为参数传递,但我想知道咖啡脚本的方式,也许还有另一种方式作为" =>"对于活动?

1 个答案:

答案 0 :(得分:2)

CoffeeScript类不太适合这种方式。当你说的话:

class C
    helpers:
        f: -> console.log(@)

helpers只是附加到C原型的对象。 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. 在创建新实例时绑定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. 将函数提供给事件处理系统时绑定函数:

    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
    
  5. 当然还有其他方法,但我认为以上是最常见的方法。