ModelやViewなどの場合
Backbone.jsをCoffeeScriptで書く時、Backbone.Model
やBackbone.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.Model
やBackbone.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 (...) {...}
他にいい方法があると思うのですが、ご存知の方がいらっしゃったらご教授ください。