如何称呼;超级";从coffeescript中的回调

如何称呼;超级";从coffeescript中的回调,coffeescript,super,Coffeescript,Super,不会编译,因为我无法从匿名类调用super。然而我 目的是调用“a”的超类方法。这是失踪的吗 咖啡脚本的能力 注意,我将代码更改为 class Foo a: -> x.call => super 让它工作,但那不是咖啡脚本的权利 您提出的写出Foo.\uu super\uuu.a.apply(这是参数)的解决方案,恐怕基本上和您将得到的一样好。CoffeeScript允许您编写以下内容 class Foo a: ->

不会编译,因为我无法从匿名类调用super。然而我 目的是调用“a”的超类方法。这是失踪的吗 咖啡脚本的能力

注意,我将代码更改为

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

让它工作,但那不是咖啡脚本的权利

您提出的写出
Foo.\uu super\uuu.a.apply(这是参数)
的解决方案,恐怕基本上和您将得到的一样好。CoffeeScript允许您编写以下内容

class Foo
    a: ->
        x.call =>
                return Foo.__super__.a.apply(this, arguments)
(在这种情况下,
super
指向
b
的super函数),因此将
super
包含在

a = ->
  b = ->
    super
指向
a
的超级函数。不过,你可以提出一个问题,要求允许这样做。从编译的角度来看,它并不含糊不清,只是看起来有点奇怪

以下是一些你可以尝试变得更优雅一点的东西:

a: ->
  x =>
    super
现在你可以使用 super::method()
相反。

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

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

  a: ->
    x =>
      @sup.a.apply this, arguments
这是非常不洁的,如果Coffeescript编译器的类语义发生变化,它可能会崩溃。然而,在等待的时候,我可以说:

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

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

您的意思可能是
x=>
而不是
x.call=>
,对吗?或者你真的希望回调是x的
这个
上下文吗?很好的解决方案,很烂的咖啡脚本没有这个内置的。。。我想优雅的语法可能看起来更像
a.super()
super.a()
,您也可以使用
@constructor.\uu super\uuuuuuuuu.functionName.apply(this,arguments)
来保存构造函数中的@sup属性设置,使其更加优雅。这似乎对解决当前的问题没有帮助。将
super
替换为
super::x
会产生相同的编译错误。您是对的。不知道为什么我把它标记为正确答案,但我已经删除了答案。此问题的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