[英]How can I call a method defined in one CoffeeScript mixin from another mixin on the same object?
我有一个CoffeeScript对象,其中包含两个mixins:
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中定义了一个方法,则可以从另一个中调用它:
window.Scatter =
extended: ->
@include
dimensions: ->
Justly.view.dimensions()
但是我不能,因为这引发了一个例外,那就是this.dimensions不是一个函数。
怎么会?
另外,如果我没有用window.
定义我的mixin window.
作为前缀,我似乎无法将其用作mixin-解决该问题的最佳方法是什么?
尽管这不能按照要求直接回答您的问题,但我相信它将为您提供解决潜在问题的工具。 最近我遇到了一种情况,我不得不创建几个类,每个类都从google maps构造函数继承。 但是为了干燥我自己的代码,我希望所有这些类也从抽象基类继承它们的通用功能。 这或多或少是我想到的(例如,简化):
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构造函数之前还是之后?其他构造函数表达式又如何?),但启用了多个继承。 多重继承通常比其价值更大,但有时是最好的解决方案。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.