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