在我的班级里面,我有对象(只是为了方便起见所有相关的功能),所以我称之为#34;这个"指向当前对象。
例如:
class Test constructor: -> @vir = "" helpers: func1: -> @vir = "a" (I can't do it because this point to object "func1") func2: ->
实际上,我可以将我的根对象(或全局变量)作为参数传递,但我想知道咖啡脚本的方式,也许还有另一种方式作为" =>"对于活动?
答案 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
根本不是一个方法。
有几种解决方法。
完全摆脱helpers
并使用=>
:
class Test
constructor: -> @vir = ""
func1: => @vir = "a"
t = new Test
f = t.func1
f() # @ is what you expect it to be
在创建新实例时绑定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()
将函数提供给事件处理系统时绑定函数:
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
当然还有其他方法,但我认为以上是最常见的方法。