在Coffeescript中使用mixin

在Coffeescript中使用mixin,coffeescript,mixins,Coffeescript,Mixins,我想使用mixin来拆分一个大类 我正在使用来自 问题是FooMixin中的@是FooMixin。我希望它是Foo 我已尝试在@include()的末尾添加行.\uBind(@:[key],@),但没有任何帮助。有什么建议吗?好吧,我做错了几件事 一, @include来自这本小书,它是一个对象而不是一个类。要使它与类一起工作,您需要编写@include FooMixin::。然而,我已经开始使用对象来代替 二, 当使用对象而不是类时,胖箭头会在CoffeeScript包装器的顶部添加一行,内

我想使用mixin来拆分一个大类

我正在使用来自


问题是
FooMixin
中的
@
FooMixin
。我希望它是
Foo


我已尝试在
@include()
的末尾添加行
.\uBind(@:[key],@)
,但没有任何帮助。有什么建议吗?

好吧,我做错了几件事

一,

@include
来自这本小书,它是一个对象而不是一个类。要使它与类一起工作,您需要编写
@include FooMixin::
。然而,我已经开始使用对象来代替

二,

当使用对象而不是类时,胖箭头会在CoffeeScript包装器的顶部添加一行,内容为
\u this=this
。所有方法都绑定到全局上下文,这不是我们想要的。要修复此问题,我们必须将胖箭头转换为瘦箭头,并将每个函数绑定到
Foo
实例。我使用下划线将其添加到
Foo
的构造函数中:

constructor: ->
  for fname in _.functions FooMixin
    @[fname] = _.bind @[fname], @
  super
我尝试了
.bindAll@,\uu.functions FooMixin
,但它给了我一个错误,在Function.bind上说类似
,无法运行未定义的绑定。
奇怪的错误,因为上面的代码与
.bindAll
方法几乎相同

因此,现在我可以将我的类拆分,以获得更好的可读性和代码共享


更新:bindAll的问题在于它需要一个splat而不是数组。修复方法是使用
\uu.bindAll@、\uu.functions(FooMixin)…

更新:找到了更好的解决方案

和原来的帖子一样。将类用于mixin

使用
@include FooMixin::
或更改
@include
对原型而不是属性进行操作

Foo
构造函数中,编写
FooMixin.call@
以正确绑定方法

这个很好用,又漂亮又干净

唯一的潜在问题是mixin将被现有属性覆盖。我能看到的唯一解决办法是做如下事情:

after = ->
  _.extend Foo, FooMixin::

class Foo
   # define...

after()

或者将extend方法传递给
。defer,但这太麻烦了,可能不起作用。

对于可能使用backbone.js(或下划线.js)的任何人,还有一个额外的注意事项,已经有一个名为defined on models的方法,它将与这里描述的方法冲突。如果你发现你遇到了各种各样的问题,试着把它改名为其他东西——这对我来说很有效。
constructor: ->
  for fname in _.functions FooMixin
    @[fname] = _.bind @[fname], @
  super
after = ->
  _.extend Foo, FooMixin::

class Foo
   # define...

after()