我有一个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 - 这是解决该问题的最佳方式?
答案 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进行调用吗?其他构造函数表达式怎么办?)但是启用了多重继承。多重继承通常比它的价值更麻烦,但有时候是最好的解决方案。