bindメソッドは関数オブジェクトのメソッドです。このメソッドを使うとどのようなことができるのでしょうか。
JavaScriptでは非同期処理の結果をコールバックするために、関数オブジェクトを使うことが多々あります。しかし、関数オブジェクトは、実行するときにオブジェクトに格納された状態でなければthisを解決できません(「第2回:JavaScriptの復習」の「関数オブジェクト」の項を参照)。
例えば、リスト12のようにamachang.sayMyNameをsetTimeoutに渡した場合、渡されるのは関数オブジェクトだけで、amachangオブジェクトとは切り離されてしまいます。
リスト12:this.nameがundefinedになる
// リスト8のHumanクラス
var amachang = new Human('天野');
setTimeout(amachang.sayMyName, 1000);
ですので、thisを解決できません。その結果、this.nameはundefinedと表示されてしまうのです。
せっかくPrototype.jsを使ってオブジェクト指向で書いているのに、メソッドをコールバックを渡せないのでは、困ってしまいます。そこでbindメソッドを使います。bindメソッドを使うとthisを束縛することができます。使い方は、引数としてthisにしたいオブジェクトを渡します。たった、それだけです。
リスト13の例を見てください。
リスト13:bindメソッドでthisを束縛する
// リスト9のHumanクラス
var amachang = new Human('天野');
setTimeout(amachang.sayMyName.bind(amachang), 1000);
このようにsayMyNameにamachangを束縛したものを、setTimeoutに渡してあげることによって、ちゃんと「天野」という文字列が表示されるようになります。
|