Backbone.js Can';t扩展coffeescript中的backbone.events

Backbone.js Can';t扩展coffeescript中的backbone.events,backbone.js,coffeescript,extends,Backbone.js,Coffeescript,Extends,我得到了一个错误: Uncaught TypeError: Cannot read property 'constructor' of undefined 声明以下类时: class ViewHelpers extends Backbone.Events 我可以使用相同的语法来扩展Backbone.Router、Views、Model等。下面是我在快速日志中编写的编译javascript,以确保Backbone.Events在那里 __t('views').ViewHelpers = (

我得到了一个错误:

Uncaught TypeError: Cannot read property 'constructor' of undefined 
声明以下类时:

 class ViewHelpers extends Backbone.Events
我可以使用相同的语法来扩展Backbone.Router、Views、Model等。下面是我在快速日志中编写的编译javascript,以确保Backbone.Events在那里

__t('views').ViewHelpers = (function(_super) {

 #how i know it is definied here
 console.log(_super.trigger)

 __extends(ViewHelpers, _super);

 function ViewHelpers() {
   return ViewHelpers.__super__.constructor.apply(this, arguments);
 }

 return ViewHelpers;

})(Backbone.Events);
因此,导致错误的行是

ViewHelpers.__super__.constructor.apply(this, arguments);

_u_extends()方法对于Backbone.View而不是Backbone.Events有什么不同

这是因为
主干.Events
不是一个“类”,所以不能扩展,它是一个“模块”,可以混合到其他对象中(参见文档)。在JavaScript术语中,这意味着它不是可以作为构造函数调用的
函数(即
新主干.Events
将抛出错误),它只是一个普通的JS对象,其属性(方法)可以分配给其他对象,使其成为事件分派器

在CoffeeScript中,您可以在创建对象时将
主干.Events
混合到对象中:

class ViewHelpers
  constructor: ->
    _.extend @, Backbone.Events
或者,您可以扩展类的原型,避免将这些方法作为所有
ViewHelpers
实例的(自己的)属性:

class ViewHelpers
  _.extend @prototype, Backbone.Events
这两种方法应该可以工作,并允许您实例化和使用ViewHelper作为事件分派器:

vh = new ViewHelpers
vh.on 'foo', -> alert 'bar'
vh.trigger 'foo'​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​
还有另一种方法(根据@epidemian的回答),它不涉及将
主干.Events
复制到一个新对象中用作原型,而是使用
对象.create
创建一个新对象用作原型,使用
主干.Events
作为原型

class ViewHelpers
  @prototype = Object.create(Backbone.Events)
现在,
ViewHelpers
“原型是一个新的空对象,其原型是
Backbone.Events
。您可以在
ViewHelpers
'原型上定义方法,而不影响
主干.Events
,但所有
主干.Events
方法仍可用于
ViewHelpers
,而无需将它们复制到新对象中。这不仅节省了(很小的)内存,而且如果您后来添加到
主干。事件
,所有
查看帮助程序
都会看到更改


为此,您需要或。

要在@epidemian的优秀答案的基础上进一步完善,我想补充一点,这有点像黑客,但它允许您使用问题中指定的
extenses
语句编写类(这允许您在所有
主干.Events
方法上调用
super
):


使用
.extend
调用
Events.constructor
函数会很好,但我无法让它工作…

\uu(@::).extend Backbone.Events
\ucode>的替代品。extend@prototype,Backbone.Events
可能读得更好(当然取决于better的本地定义).@muistooshort-Yeap,与之相反的是
@:
是,在这种情况下,
的可视助手。prototype
(对于任何想知道=D的人)。非常有用的帖子,深入了解了咖啡和主干是如何为如此简短的答案工作的!请注意,
ViewHelpers
正在被
Backbone.Events
扩展(关闭),因此不要期望能够定义自己的
on
off
trigger
方法(例如,包装
Backbone.Events
的方法,以便通过
super
调用它们)我已经在下面的回答中对Backbone.Events和其他主干对象之间的区别进行了评论,但是,我想问:ViewHelper的用途是什么?因为它的名称不是类的典型名称(即单数名词),所以可能一个类不是您所需要的。下面的答案很好,谢谢!我同意助手通常是在全球范围内定义的。在本例中,我在类ViewHelpers中维护一个函数库,该函数库被实例化为主控制器类的属性。有一些函数(例如CSS transitionEnd处理程序),我可能希望订阅多个侦听器,而不是传递单个回调。因为我已经在使用主干网,所以我想我应该将事件“class”(object)子类化。很抱歉,我的回复迟到了,我不知道为什么几个月前没有收到通知。
class Events
_.extend Events.prototype, Backbone.Events

class CustomEvents extends Events

    trigger: (event, etc...) ->
        # You can add overrides before
        super "custom:#{event}", etc...
        # or after the super class methods