【发布时间】:2014-03-16 00:39:08
【问题描述】:
我有两个看起来像这样的基类(在此示例中进行了显着简化):
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 混合示例: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:无法读取未定义的属性“构造函数”
如何让 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
【问题讨论】:
标签: javascript inheritance constructor coffeescript mixins