我今天开始使用CoffeeScript,当我需要回调函数时,发现自己使用了(args...) => @style(args...)
这样的模式。上下文大致如下:
class Parent
@style: (feature) ->
if feature
@insight()
class Child extends Parent
@insight: ->
alert 'Sara is awesome'
@load: ->
[42].forEach((args...) => @style(args...))
Child.load()
这显示Sara is awesome
,这是准确的。如果我只使用了[42].forEach(@style)
,那么style
最终会引用一个this
引用父类(我认为?),它不知道insight
。
但这非常冗长,我的代码中需要很多回调函数。是否有更优雅,惯用的方法来解决这个问题?
(在CoffeeScript中使用forEach
是我读过的糟糕的风格,但在我的实际代码中,我正在使用各种Leaflet函数,我不能用for循环替换它。)
答案 0 :(得分:2)
首先要注意的是,您不应该从insight
课程中调用Parent
。一个类的整个目的是提供封装。所以我要做的第一件事就是将insight
移到Parent
要回答你的问题,更难以解决的方法是使用胖箭头表示法。胖箭头内部的作用是创建一个匿名函数来封装this
。
那就是说,最终的代码应该是这样的:
class Parent
@style: (feature) =>
if feature
@insight()
@insight: ->
alert 'Sara is awesome'
class Child extends Parent
@load: ->
[42].forEach(@style)
Child.load()
希望有所帮助。
修改强>
基于OP评论:
class Parent
style: (feature) =>
if feature
@insight()
class Child extends Parent
load: ->
[42].forEach(@style)
insight: ->
alert 'Sara is awesome'
(new Child()).load()