【问题标题】:Coffeescript class mixin not working for constructorCoffeescript 类混合不适用于构造函数
【发布时间】: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

我正在尝试让 Ne​​wFoo 和 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


    【解决方案1】:

    你基本上是用 Mixin 做的:

    class Mixin
      constructor:->
        super
    

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

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

    【讨论】:

    • 我明白了,有没有办法做到这一点?
    • 当然,你可以在 Mixed 构造函数中应用所有的 mixin 构造函数。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-01
    • 2019-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-02
    相关资源
    最近更新 更多