Я столкнулся с той же проблемой и решил ее так:
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 аргументов в Super (), когда метод вызывается с более чем n аргументами, только первые n аргументов перезаписываются при вызове метода super, а остальные будет передано без изменений.