LoginSignup
26
25

More than 5 years have passed since last update.

Backbone.jsをCoffeeで書いた時のEventsの継承の仕方

Posted at

ModelやViewなどの場合

Backbone.jsをCoffeeScriptで書く時、Backbone.ModelBackbone.Viewの継承はたとえばこんな書き方ができる。

# model
class Hoge extends Backbone.Model
    constuctor: ->
        super
        @set fuga: 'fuga'

# View
class HogeView extends Backbone.View
    constuctor: ->
        @model = new Hoge
        super
    fuga: ->
        @model.get 'fuga'

Backbone.ModelBackbone.Viewがコンストラクタでprototypeにプロパティをちゃんと持っているから。

Eventsの場合

これでできると思ってた。

class EventDispatcher extends Backbone.Events

# でもインスタンスを作ってみると
dispatcher = new EventDispatcher
console.log dispatcher.on # -> undefined

メソッドが定義されていない。


これは当然で、Backbone.EventsはただのObjectであってprototypeにプロパティやメソッドをもつコンストラクタでもなければFunctionでもないから。

公式ドキュメントを参考に、継承の方法をみてみると

# これが公式の方法
dispatcher = _.extend {}, Backbone.Events

# もしくは別の方法でこんなのとか
dispatcher = _.clone Backbone.Events

でもあくまでこれはBackbone.Eventsのプロパティやメソッドをコピーしたオブジェクトであって、クラスから生成されたインスタンスではない。

もっと機能をつけたクラスを作りたい場合はどうしたらよいか。

class EventDispatcher
    # ここでprototypeに無理やり継承させる
    _.extend @::, Backbone.Events
    fuga: null
    piyo: null
    constructor: ->
        @fuga = {}
        @piyo = []

# これで継承できてる
dispatcher = new EventDispatcher
console.log dispatcher.on # -> function (...) {...}

他にいい方法があると思うのですが、ご存知の方がいらっしゃったらご教授ください。


参考

26
25
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
26
25