Prototype.jsのbind()がすること
バージョン1.6.0.3。
Function.prototype.bind()
thisと引数の値を固定化した関数を返すメソッド。
第一引数にthisとなる値、第二引数以降に固定化する引数の値を指定する。
Function.prototypeを直接拡張している。
Object.extend(Function.prototype, { // 略 bind: function() { // 引数の数が1以下で、第一引数がundefinedの場合は関数をそのまま返す if (arguments.length < 2 && Object.isUndefined(arguments[0])) return this; var __method = this, // bind実行時のthisは関数そのもの args = $A(arguments), // 固定化される引数 object = args.shift(); // 関数実行時にthisとなるオブジェクト // thisと引数を固定化した関数を返す。固定化した以外の残りの引数は直接受け取ることができる return function() { // 元の関数をapplyメソッドで呼び出し、結果をreturn return __method.apply(object, args.concat($A(arguments))); } }, // 略 });
- Function.prototype.apply : 第一引数をthisに結びつけ、第二引数を引数の配列として関数を呼び出す。
Function.prototype.bindAsEventListener()
イベントのコールバック用にthisと引数の値を固定化した関数を返すメソッド。
引数の指定方法はbindと同じだが、返される関数は第一引数でeventオブジェクトを取る。
その他の引数を受け取ることはできない(コールバック関数なので必要がない)。
Object.extend(Function.prototype, { // 略 bindAsEventListener: function() { var __method = this, args = $A(arguments), object = args.shift(); // 引数にeventオブジェクトをとる関数を返す。thisと残りの引数は固定化される。 return function(event) { // eventオブジェクトを第一引数として関数を呼び出す return __method.apply(object, [event || window.event].concat(args)); } }, // 略 });