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));
    }
  },

  // 略
});