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

How can I call a method defined in one CoffeeScript mixin from another mixin on the same object?

本文关键字:mixin 一个 CoffeeScript 方法 定义 调用 对象 另一个      更新时间:2023-09-26

我有一个包含两个mixins的CoffeeScript对象:

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中定义的方法?我希望如果我在一个mixin中定义了一个方法,我可以从另一个mixin中调用它:

window.Scatter =
  extended: ->
    @include
      dimensions: ->
        Justly.view.dimensions()

但是我不能,因为这会抛出一个异常。维度不是函数

如何来吗?

另外,如果我不将我的mixin与window.定义为前缀,我似乎不能将其用作mixin -解决这个问题的最佳方法是什么?

虽然这并没有直接回答您的问题,但我相信它将为您提供一个解决潜在问题的工具。我最近遇到了一种情况,我必须创建几个类,每个类都继承自google maps构造函数。但是为了DRY我自己的代码,我希望所有这些类也从抽象基类继承它们的公共功能。以下是我想到的(例如简化):

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

你可能不得不在每个派生类的构造函数中调整应用程序的顺序(调用super是在应用MyBaseClass构造函数之前还是之后?)那么其他构造函数表达式呢?),但支持多重继承。多重继承通常带来的麻烦大于它的价值,但有时却是最好的解决方案。