如何从同一对象上的另一个mixin调用一个CoffeeScript mixin中定义的方法?

时间:2015-10-10 21:31:31

标签: javascript coffeescript mixins

我有一个CoffeeScript对象,其中包含两个mixin:

namespace 'S.Graphs', (exports) ->
  class exports.DocketEvents extends Module
    @extend Scatter
    @extend Axis

    name: 'DocketEvent'

    constructor: ({@litigation}) ->
      console.log("Building view of docket events for #{@litigation.name}")

如何调用另一个mixin中定义的方法?我希望如果我在一个mixin中定义一个方法,我可以从另一个中调用它:

window.Scatter =
  extended: ->
    @include

      dimensions: ->
        Justly.view.dimensions()

但我不能因为这会引发一个例外,即这个维度不是一个功能。

怎么回事?

另外,如果我没有用window.作为前缀来定义我的mixin,我似乎无法将其用作mixin - 这是解决该问题的最佳方式?

1 个答案:

答案 0 :(得分:0)

虽然这不会直接回答您提出的问题,但我相信它会为您提供一个解决潜在问题的工具。我最近出现了一种情况,我不得不创建几个类,每个类都继承自谷歌地图构造函数。但是为了干掉我自己的代码,我希望所有这些类也从一个抽象基类继承它们的通用功能。这里或多或少是我提出的(例如简化):

mixin = (obj, mixes...) ->
    mixes.forEach (mix) ->
        Object.keys(mix).forEach (key) -> obj[key] = mix[key]
    return obj

class MyBaseClass
    constructor: () ->
        #init some vars

    method1: () -> #do stuff
    method2: () -> #do stuff

class Signal extends google.maps.Marker
    constructor: () ->
        super()                            #adds google maps goodness
        MyBaseClass.apply(this, arguments) #inits the vars
        @type = 'signal'

    signalMethod1: () -> #do stuff

#add base class methods. Messing directly with class prototypes is considered by
#some to be something of an antipattern in coffeescript, but it achieves the 
#desired effect here.
mixin Signal.prototype, MyBaseClass.prototype

您可能必须在每个派生类的构造函数中调整应用程序顺序(在应用MyBaseClass构造函数之前或之后对super进行调用吗?其他构造函数表达式怎么办?)但是启用了多重继承。多重继承通常比它的价值更麻烦,但有时候是最好的解决方案。