在其他 类 之间共享两个实例

Share two instances between other classes

我有 4 个 coffeescript classes 如下:

class Main
  constructor: (element) ->
    @element = $(element)
    @one = new One()
    @two = new Two(@one)
    @dummy = new Dummy(@one, @two)

class One
  constructor: (class_two_instance) ->
    # do something

class Two
  constructor: (class_one_instance) ->
    # do something

class Dummy
  constructor: (class_one_instance, class_two_instance)
    # do something
jQuery ->
  new Main($("#main"))

我需要 class One 和 class Two 在所有其他(实际或未来)classes 之间共享。

我开始做的是将它们作为参数传递,正如您在 Main class

中看到的
@dummy = new Dummy(@one, @two)

但是对于classOne我只需要通过@two。对于 class Two 同样的事情我只需要通过 @one

不幸的是,如您所见,似乎无法同时执行此操作(我无法将 @two 作为 new One() 的参数传递):

@one = new One()
@two = new Two(@one)

有办法解决吗?

您可以将它们作为原型对象传递。

Dummy.prototype = Object.create(Two.prototype);

然后你可以用 class 两个做同样的事情并将它的原型设置为一个。

Two.prototype = Object.create(One.prototype);

现在 Dummy 实例将可以访问在 Class 一和 Class 二的原型上声明的所有函数和属性。

如您所见,要使此模式起作用,您需要在一和二的原型上定义所有 public 方法和属性。

我觉得 onetwo 根本不应该是 类,只是单个对象:

one = {
  data: "I'm one",
  method: () ->
    # do something
    # if needed, you can use two here
}
two = {
  data: "I'm two",
  method: () ->
    # do something else
    # if needed, you can use one here
}
class Main
  constructor: (element) ->
    @element = $(element)
    @dummy = new Dummy()
    # if needed, you can use one and two here

class Dummy
  constructor: () ->
    # do something
    # if needed, you can use one and two here

jQuery ->
  new Main($("#main"))