【问题标题】:coffeescript how to set binding" to a child class in a callback function defined in parent class咖啡脚本如何设置绑定”到父类中定义的回调函数中的子类
【发布时间】:2013-02-11 23:16:35
【问题描述】:

我想在子类中更改回调函数的绑定,使下面的代码指示 20,而不是 10:

class A 
  @in = 10
  @b: =>
    alert(@in)

class B extends A
  @in = 20

  @w: ->
    window.setTimeout(@b,500)

B.w()

如果我'thin-arrow' A.b 的定义,那么绑定到超时调用函数,所以@in 是未定义的。当我对它进行粗箭头时,它会绑定到父类 A。我希望它绑定到子类 B,而无需重新定义子类中的方法。

谢谢

【问题讨论】:

  • 一切都设置为使用类方法有什么特别的原因吗?你的 @in = 10 有点像类变量,但不是真的。
  • 是的,在这个特定的设计中有类方法和实例方法,我正在尝试用类方法来做到这一点。如果我使用实例方法,它的行为符合预期(在等效示例中我得到 20)。
  • class 在 CoffeeScript 中有点谎言,真的没有这样的东西。您的@in = 10A.in = 10 相同,因此不涉及原型,因此在@b 内解析@in 时不使用继承关系。
  • 确实,该类确实是“类-ish”,但是如果我在 A 中用细箭头定义 B,B.b() 确实返回 20:问题是,如果它是用细箭头定义的,那么它回调中没有正确的绑定。

标签: coffeescript


【解决方案1】:

我认为您能做的最好的事情就是在设置setTimeout 呼叫时手动强制进行适当的绑定。在A 中定义@b 时删除=>

class A 
  #...
  @b: -> alert(@in)

然后在调用setTimeout时设置B中的绑定:

class B extends A
  #...
  @w: ->
    f = => @b()
    window.setTimeout(f, 500)

我认为这与使用 CoffeeScript 的伪类方法最接近。

演示:http://jsfiddle.net/ambiguous/Y6S8D/

【讨论】:

    猜你喜欢
    • 2012-05-14
    • 2016-06-20
    • 1970-01-01
    • 2012-01-17
    • 1970-01-01
    • 2019-10-16
    • 1970-01-01
    • 2013-01-09
    • 1970-01-01
    相关资源
    最近更新 更多