15

我收到错误:

Uncaught TypeError: Cannot read property 'constructor' of undefined 

声明以下类时:

 class ViewHelpers extends Backbone.Events

我可以使用相同的语法来扩展 Backbone.Router、视图、模型等。这是我在快速日志中编写的已编译 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);

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

4

3 回答 3

38

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

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

class ViewHelpers
  constructor: ->
    _.extend @, Backbone.Events

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

class ViewHelpers
  _.extend @prototype, Backbone.Events

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

vh = new ViewHelpers
vh.on 'foo', -> alert 'bar'
vh.trigger 'foo'​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​
于 2012-06-17T01:16:21.690 回答
1

还有另一种方法(来自@epidemian 的回答),它不涉及复制Backbone.Events到一个新对象中以用作您的原型 - 相反,用于Object.create创建一个新对象以用作您的原型,Backbone.Events用作原型。

class ViewHelpers
  @prototype = Object.create(Backbone.Events)

现在ViewHelpers' 原型是一个新的空对象,其原型是Backbone.EventsViewHelpers您可以在' 原型上定义方法而不会影响Backbone.Events,但所有Backbone.Events方法仍然可用于ViewHelpers,而无需将它们复制到新对象中。这不仅节省了(微不足道的)内存,而且如果你最终添加到Backbone.Events以后,所有ViewHelpers的 s 都会看到变化。

为此,您需要具有 ES5Object.create功能的浏览器或polyfillObject.create

于 2014-01-10T06:23:49.240 回答
0

为了建立在@epidemian 的出色答案的基础上,我要补充一点,这有点小技巧,但它允许您使用extends问题中指定的语句编写您的类(它允许您调用super所有Backbone.Events方法):

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

_.extend将调用工作到函数中会很整洁,Events.constructor但我无法让它工作......

于 2015-09-02T16:19:47.863 回答