Coffeescript'@'或函数和类中的这个

时间:2012-09-05 13:35:35

标签: javascript coffeescript

在coffeescript中有以下课程:

class Canvas
  constructor: (finder) ->
    @canvas = $(finder)
    @mouse_down()
  mouse_down: ->
    @canvas.mousedown (e) ->
      mouse_x = e.pageX - @offsetLeft
      ### ... ###
      @redraw()
  redraw: ->
    ### ... ###

问题是在redraw函数中调用类对象mousedown方法。这样做的最佳解决方案是什么?我发现只有:

  mouse_down: ->
    @canvas.mousedown (e) =>
      mouse_x = e.pageX - @canvas[0].offsetLeft
      ### ... ###
      @redraw()

2 个答案:

答案 0 :(得分:2)

检查出来:

class Canvas
   constructor: (finder) ->
      @canvas = $(finder)
      @mouse_down()
   mouse_down: ->
      redrawCallback = @redraw
      @canvas.mousedown (e) ->
         mouse_x = e.pageX - @offsetLeft
         ### ... ###
         redrawCallback()
   redraw: ->
      ### ... ###

如果redraw无论如何都指向@(Canvas类),那就更好了(无论如何都更安全):

class Canvas
  constructor: (finder) ->
     @canvas = $(finder)
     @mouse_down()
  mouse_down: ->
     redrawCallback = => @redraw()
     @canvas.mousedown (e) ->
        mouse_x = e.pageX - @offsetLeft
        ### ... ###
        redrawCallback()
  redraw: ->
     ### ... ###

PS。虽然这是一个品味问题,但我相信骆驼的情况会比方法名称更好地匹配而不是强调。

答案 1 :(得分:1)

您找到了更好的解决方案。但如果你想要,你可以这样写:

mouse_down: ->
    self = @ 
    @canvas.mousedown (e) ->
      mouse_x = e.pageX - self.canvas[0].offsetLeft
      ### ... ###
      self.redraw()