Javascript 如何从同一对象上的另一个mixin调用在一个CoffeeScript mixin中定义的方法?
我有一个CoffeeScript对象,它包含两个混合器: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
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