我有两个基类,看起来像这样(在这个例子中显着简化):
class Foo
constructor: (@foo) ->
class Bar
constructor: (@bar) ->
然后我还有两个类通过扩展和增加功能来扩展/增强这些类:
class NewFoo extends Foo
getFoo: ->
@foo
class NewBar extends Bar
getBar: ->
@bar
但是,我还希望NewFoo和NewBar继承一个通用的构造函数/其他方法,例如。
class Mixin
constructor: (x) ->
@history = 'something'
super x
getHistory: ->
@history
我试图让NewFoo和NewBar拥有Mixin构造函数和getHistory方法..
我尝试使用coffeescriptcookbook mixin示例:http://coffeescriptcookbook.com/chapters/classes_and_objects/mixins
mixOf = (base, mixins...) ->
class Mixed extends base
for mixin in mixins by -1 #earlier mixins override later ones
for name, method of mixin::
Mixed::[name] = method
Mixed
所以NewFoo / NewBar成为:
class NewFoo extends mixOf Mixin, Foo
getFoo: ->
@foo
class NewBar extends mixOf Mixin, Bar
getBar: ->
@bar
但是这不起作用并且因错误而失败: TypeError:无法读取未定义
的属性'constructor'如何让NewFoo / NewBar继承常见的Mixin成员及其各自的基类?
编辑:
到目前为止,我已经能够提出这一切:
class Foo
constructor: (@foo) ->
class Bar
constructor: (@bar) ->
history = (base) ->
class History extends base
constructor: (param) ->
@history = 'something'
super param
getHistory: ->
@history
History
class NewFoo extends history Foo
getFoo: ->
@foo
class NewBar extends history Bar
getBar: ->
@bar
newFoo = new NewFoo 'a foo'
console.log newFoo.getFoo()
console.log newFoo.history
答案 0 :(得分:0)
你基本上是用Mixin做的:
class Mixin
constructor:->
super
如果您致电new Mixin();
,您将收到错误消息。你不能在没有任何扩展的构造函数上调用super。
mixOf函数没有解决这个问题,它只是从其他对象复制方法并产生一个类。