Coffeescript类mixin不适用于构造函数

时间:2014-02-16 21:24:12

标签: javascript inheritance constructor coffeescript mixins

我有两个基类,看起来像这样(在这个例子中显着简化):

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

1 个答案:

答案 0 :(得分:0)

你基本上是用Mixin做的:

class Mixin
  constructor:->
    super

如果您致电new Mixin();,您将收到错误消息。你不能在没有任何扩展的构造函数上调用super。

mixOf函数没有解决这个问题,它只是从其他对象复制方法并产生一个类。