15

エラーが発生します:

Uncaught TypeError: Cannot read property 'constructor' of undefined 

次のクラスを宣言する場合:

 class ViewHelpers extends Backbone.Events

同じ構文を使用して、Backbone.Router、Views、Model などを拡張できます。Backbone.Events があることを確認するためにクイック ログに書き込んだコンパイル済みの JavaScript を次に示します。

__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);

Backbone.Events ではなく Backbone.View で機能する __extends() メソッドの違いは何ですか?

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

これら 2 つのアプローチが機能し、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で、'prototype は、プロトタイプが である新しい空のオブジェクトですBackbone.EventsViewHelpers' に影響を与えずにプロトタイプでメソッドを定義できますBackbone.Eventsが、すべてのメソッドは新しいオブジェクトにコピーする必要なく、Backbone.Events引き続き で使用できます。ViewHelpersこれにより、(ごくわずかな量の) メモリが節約されるだけでなく、Backbone.Events後でメモリを追加することになった場合、すべてViewHelpersの s に変更が反映されます。

このためには、ES5 のObject.create機能を備えたブラウザ、またはポリフィルObject.create必要です。

于 2014-01-10T06:23:49.240 に答える