Class 将父类的引用传递给子类

Class 将父类的引用传递给子类,class,coffeescript,Class,Coffeescript,我试图将对父类实例的引用传递给其子类。父类是: class UI constructor: (parameters) -> @addBTS = new AddBTS @toolbar = new Toolbar(this) AddBts和Toolbar类包括: class Toolbar constructor: (@parent) -> add_bts_clickhandler: () => $('body').on 'click'

我试图将对父类实例的引用传递给其子类。父类是:

class UI

  constructor: (parameters) ->

    @addBTS = new AddBTS
    @toolbar = new Toolbar(this)
AddBts和Toolbar类包括:

class Toolbar
  constructor: (@parent) ->

  add_bts_clickhandler: () =>
    $('body').on 'click', '#add_bts', ->
      @parent.addBTS.display()

class AddBTS
  constructor: () ->


  display: () =>
    $("#setBuildingTileSet").show()
    console.log 'Showing Sir'
所有这些类都在单独的CoffeeScript文件中定义,并按以下顺序连接在一起(游戏是UI实例所在的地方):

否,当我调用
add\u bts\u clickhandler:()
时,我收到错误消息:*无法读取未定义的属性'addBTS'*

所以它认为父对象是未定义的,而显然不是

请有人帮帮我,我完全被困在这里了,因为我的代码接缝很好。

我的解决方案:

我调用add_bts_clickhandler:

ui = new window.UI();
ui.toolbar.add_bts_clickhandler();
我的班级:

class window.UI
  constructor: (parameters) ->
    @addBTS = new window.AddBTS
    @toolbar = new window.Toolbar(this)


class window.AddBTS
  constructor: () ->

  display: () =>
    $("#setBuildingTileSet").show()
    console.log 'Showing Sir'


class window.Toolbar
  constructor: (@parent) ->

  add_bts_clickhandler: () =>
    p = @parent  ## introduce a new variable!
    $('body').on 'click', '#add_bts', ->
      p.addBTS.display(); ##
      #@parent.addBTS.display() 
让我们更仔细地看一下工具栏类:

class window.Toolbar
    constructor: (@parent) ->

    add_bts_clickhandler: () =>
        $('body').on 'click', '#add_bts', ->
            @parent.addBTS.display() 
生成的javascript的一部分:

Toolbar.prototype.add_bts_clickhandler = function() {
    return $('body').on('click', '#add_bts', function() {
        return this.parent.addBTS.display();
    });
};
在此行中:返回this.parent.addBTS.display()
这是指回调函数()!不添加到添加\u bts\u clickhandler

我希望我帮助了你

Toolbar.prototype.add_bts_clickhandler = function() {
    return $('body').on('click', '#add_bts', function() {
        return this.parent.addBTS.display();
    });
};