无法在coffeescript中扩展backbone.events

ben*_*sen 15 extends coffeescript backbone.js

我收到错误:

Uncaught TypeError: Cannot read property 'constructor' of undefined 
Run Code Online (Sandbox Code Playgroud)

声明以下类时:

 class ViewHelpers extends Backbone.Events
Run Code Online (Sandbox Code Playgroud)

我可以使用相同的语法来扩展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);
Run Code Online (Sandbox Code Playgroud)

因此引起错误的行是

ViewHelpers.__super__.constructor.apply(this, arguments);
Run Code Online (Sandbox Code Playgroud)

__extends()方法有什么不同,它适用于Backbone.View而不是Backbone.Events?

epi*_*ian 38

那是因为Backbone.Events它不是一个"类",所以它不能被扩展,它是一个可以混合到其他对象中的"模块"(参见这里的文档).在JavaScript术语中,这意味着它不是a Function,可以被称为构造函数(new Backbone.Events即将抛出错误),它只是一个普通的JS对象,其属性(方法)可以分配给其他对象以使它们成为事件调度程序.

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

class ViewHelpers
  constructor: ->
    _.extend @, Backbone.Events
Run Code Online (Sandbox Code Playgroud)

或者你可以扩展类的原型并避免将这些方法作为所有ViewHelpers实例的(自己的)属性:

class ViewHelpers
  _.extend @prototype, Backbone.Events
Run Code Online (Sandbox Code Playgroud)

这两种方法应该有效,让您实例化ViewHelpers并将其用作事件调度程序:

vh = new ViewHelpers
vh.on 'foo', -> alert 'bar'
vh.trigger 'foo'????????????????????????????????
Run Code Online (Sandbox Code Playgroud)

  • `_(@::).extend Backbone.Events`是`_.extend @prototype,Backbone.Events`的替代品,它可能读得更好(当然,取决于*更好*的本地定义). (6认同)
  • @muistooshort Yeap,和`@ ::`的极端对立的明确替代方案,在这种情况下,是`ViewHelpers.prototype`(对于任何想知道= D的人). (2认同)