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

Javascript 如何从同一对象上的另一个mixin调用在一个CoffeeScript mixin中定义的方法?,javascript,coffeescript,mixins,Javascript,Coffeescript,Mixins,我有一个CoffeeScript对象,它包含两个混合器: namespace 'S.Graphs', (exports) -> class exports.DocketEvents extends Module @extend Scatter @extend Axis name: 'DocketEvent' constructor: ({@litigation}) -> console.log("Building view of d

我有一个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()
但我不能,因为这引发了一个例外,this.dimensions不是一个函数

为什么


另外,如果我没有定义与窗口的混合。作为前缀,我似乎无法将其用作mixin-解决此问题的最佳方法是什么?

虽然这并不能直接回答您的问题,但我相信它将为您提供一个解决潜在问题的工具。我最近遇到了一个情况,我必须创建几个类,每个类都继承自GoogleMaps构造函数。但是为了使我自己的代码干涸,我希望所有这些类也从抽象基类继承它们的公共功能。以下是我大致得出的结论,例如:

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构造函数之前还是之后进行的?其他构造函数表达式呢?但支持多重继承。多重继承通常比它的价值更麻烦,但有时是最好的解决方案。

需要窗口的原因。前缀是coffeescript在IIFE中包装每个文件。您需要通过模块系统导出该类,或者将其附加到全局对象。您知道如何从同一对象上的另一个mixin调用一个mixin的方法吗?很难说是因为没有比您发布的更多的代码。通常,如果我在做mixin,我将使用mixin=obj,mixes…->mixes.forEachmix->Object.keysmix.forEachkey->obj[key]=mix[key];返回obj。然后我就用类prototype作为第一个值,mixin对象作为第二个值来调用它。如果mixin是函数而不是对象,那么我使用OtherConstructor.applySomeClass.prototype,args