class Foo
a: ->
x.call =>
super
将无法编译,因为我无法从匿名类调用super。不过我的 意图是将超类方法称为'a'。这是一个缺失 coffeescript的能力?
请注意,我将代码更改为
class Foo
a: ->
x.call =>
return Foo.__super__.a.apply(this, arguments)
让它发挥作用,但这不是正确的coffeescript!
答案 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)
现在你可以使用了 超级::()的方法 代替。