如何从coffeescript中的回调中调用“super”

时间:2011-06-28 08:46:43

标签: coffeescript super

class Foo
    a: ->
        x.call =>
            super

将无法编译,因为我无法从匿名类调用super。不过我的 意图是将超类方法称为'a'。这是一个缺失 coffeescript的能力?

请注意,我将代码更改为

class Foo
    a: ->
        x.call =>
                return Foo.__super__.a.apply(this, arguments)

让它发挥作用,但这不是正确的coffeescript!

3 个答案:

答案 0 :(得分:9)

你提出的写出Foo.__super__.a.apply(this, arguments)的解决方案,我担心的,基本上和你要得到的一样好。 CoffeeScript允许您编写

之类的内容
a = ->
  b = ->
    super

(在这种情况下super指向b的超级函数),因此在

中使用super会有点混乱
a: ->
  x =>
    super

指向a的超级功能。但是,您可以提出一个问题,要求允许这样做。从汇编的角度来看,它并不含糊,只是有点奇怪。

这是你可以尝试更优雅的东西:

class Foo
  constructor: ->
    @sup = Foo.__super__

  a: ->
    x =>
      @sup.a.apply this, arguments

答案 1 :(得分:1)

我遇到了同样的问题并解决了这个问题:

ChainSuper = (classType, memberName, useFatArrow) ->
  original = classType::[memberName]
  superf  = classType.__super__.constructor.prototype[memberName]
  callSuper = (thisRef, args, superArgs) ->
    for i in [0...superArgs.length]
      args[i] = superArgs[i]
    superf.apply thisRef, args

  classType::[memberName] = if useFatArrow
    (args...) ->
      original.call @, args..., (superArgs...) =>
        callSuper @, args, superArgs
  else
    (args...) ->
      original.call @, args..., (thisRef, superArgs...) ->
        callSuper thisRef, args, superArgs

这非常非犹太人,如果Coffeescript编译器的类语义发生变化,可能会破坏。然而,在等待时,我可以说:

CheckSuper = (ref, message) ->
  if ref instanceof Superclass
    alert "Works with #{message}"

class Superclass
  plus: (values...) ->
    CheckSuper @, 'plus'
    @val = 0
    for i in values
      @val += i
    alert @val

  minusBase: 0
  minus: (values...) ->
    CheckSuper @, 'minus'
    @val = @minusBase
    for i in values
      @val -= i
    alert @val

class Subclass extends Superclass
  plus: (values..., Super) ->
    setTimeout (=> Super @), 0
  ChainSuper @, 'plus'

  minus: (values..., Super) =>
    @minusBase = values[0]
    setTimeout (-> Super values[1...]..., 0), 0
  ChainSuper @, 'minus', true


subInstance = new Subclass()
subInstance.plus 1, 2, 3, 4
minus = subInstance.minus
minus 100, 10, 1

请注意,使用此解决方案,如果在使用多于n个参数调用方法时将n个参数传递给Super(),则在调用super方法时只会覆盖前n个参数,其余参数将被覆盖将保持不变。

答案 2 :(得分:0)

现在你可以使用了     超级::()的方法 代替。