prototype.js bindメソッド

昨日の続き。

this.timer =  new PeriodicalExecuter(this.showCounter, 2);

と書いたときに何故未定義のエラーになったか。
prototype.jsのPeriodicalExecuterクラスのコンストラクタの定義を見ると、

PeriodicalExecuter:[constructor](callback, interval)

引数名 内容
callback a function that will be passed the PeriodcalExecuter object itself as the only argument
interval the interval (in seconds)

となっている。
第一引数には、関数オブジェクトを渡してあげないとならない。
が、JavaScriptの場合、上の様な書き方をするとthisは関数オブジェクトを呼び出したときにその関数オブジェクトを格納していたインスタンスを指し、このタイマーが収められているインスタンスを指さない。
(書いている人=私は指してるつもりだったのだけど)


で、ここでprototype.jsの拡張、"bind"メソッドを使う。

this.timer =  new PeriodicalExecuter(this.showCounter.bind(this), 2);

と書く事によって、thisが指す先を束縛することができる。bindの引数には束縛するインスタンスを指定する。
ここでは、自身のクラスから生成されたインスタンスを指すので 〜.bind(this) とすることで問題が解決した。


…ややこしいなぁ。まだ、「なんとなく」わかった状態だ。
絵に描いたらわかるかなぁ。と思ってノートにメモ書きしてみたけど、ますます混乱…。