我正在尝试访问 a 中的实例方法map
调用,不幸的是我对实例对象的引用被重新定义为 Window.我不确定如何获取我的实例方法:
class Test
constructor: (@an_array) ->
f: () ->
@an_array.map (value) ->
@a(value)
a: (value) ->
alert value
t = new Test [1, 2, 3]
t.f() // TypeError: Object [object Window] has no method 'a'
这是上面代码的功能链接
有多种方法可以解决这个问题。
CoffeeScript 中最常见的是使用粗箭头(=>)产生一个绑定函数:
@an_array.map (value) => @a(value)
Demo: http://jsfiddle.net/ambigously/6BW8q/
标准 JavaScript 方法也可以工作(有时是必要的或更合适的):
-
保存参考@
这样你就不必关心什么this
在回调函数内部:
_this = @
@an_array.map (value) -> _this.a(value)
Demo: http://jsfiddle.net/ambiguously/XhP4z/
我倾向于使用_this
代替self
由于存在而作为该事物的名称window.self和有趣的如果您忘记了会导致的错误var
在 JavaScript 中。
-
使用手动创建绑定函数Function.bind,但这并没有得到普遍支持:
@an_array.map ((value) -> @a(value)).bind(@)
Demo: http://jsfiddle.net/ambigously/n2XnC/
-
使用 jQuery 的$.proxy, 下划线的_.bind,或其他一些非本机绑定函数实现:
@an_array.map _((value) -> @a(value)).bind(@)
Demo: http://jsfiddle.net/ambigously/LAy9L/
您选择哪一种取决于您的环境和具体需求:
- 如果您尝试绑定来自其他地方的函数,那么您不能使用
=>
所以你需要使用一些变体(2) or (3)上面(或者可能Function.call or Function.apply).
- 如果您同时需要内部和外部
this
同时你会去(1).
- 如果您需要手动绑定函数但不确定本机函数
bind
存在那么你可能最终会得到(3)以及哪个分支(3)可能取决于您已有的可用库。
- ...
- Profit.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)