Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/426.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Coffeescript类mixin不适用于构造函数_Javascript_Inheritance_Constructor_Coffeescript_Mixins - Fatal编程技术网

Javascript Coffeescript类mixin不适用于构造函数

Javascript Coffeescript类mixin不适用于构造函数,javascript,inheritance,constructor,coffeescript,mixins,Javascript,Inheritance,Constructor,Coffeescript,Mixins,我有两个基类,如下所示(本例大大简化): 然后,我有另外两个类,它们通过扩展这些类并添加功能来扩展/增强这些类: class NewFoo extends Foo getFoo: -> @foo class NewBar extends Bar getBar: -> @bar 但是,我也希望NewFoo和NewBar继承一个公共构造函数/其他方法,例如 class Mixin constructor: (x) -> @history =

我有两个基类,如下所示(本例大大简化):

然后,我有另外两个类,它们通过扩展这些类并添加功能来扩展/增强这些类:

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示例:

因此,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

您基本上是通过Mixin实现的:

class Mixin
  constructor:->
    super
如果调用
new Mixin()您将得到一个错误。不能对不扩展任何内容的构造函数调用super


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

我明白了,那么有没有办法实现这一点?当然,可以在混合构造函数中应用所有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
class Mixin
  constructor:->
    super