JavaScriptの関数オブジェクトを拡張する

関数オブジェクトにあると便利なんじゃないかと思ったメソッドを適当に生やしてみた。

// 関数を合成するメソッド
Function.prototype.compose = function(a) {
    var self = this;
    return function() {
        return self(a.apply(null, arguments));
    };
};

// 合成する順番を逆にした以外はcomposeと同じ
Function.prototype.prepose = function(a) {
    var self = this;
    return function() {
        return a(self.apply(null, arguments));   
    };
};

// カリー化する
Function.prototype.bind = function() {
    var base = [];
    for (var i = 0; i < base.length; i++) base.push(arguments[i]);
    var self = this;
    return function() {
        var args = [];
        for (var i = 0; i < arguments.length; i++) args.push(arguments[i]);
        return self.apply(null, base.concat(args));
    };
};

// 右側の引数からカリー化する
Function.prototype.bindRight = function() {
    var back = [];
    for (var i = 0; i < arguments.length; i++) back.push(arguments[i]);
    var self = this;
    return function() {
        var args = [];
        for (var i = 0; i < arguments.length; i++) args.push(arguments[i]);
        return self.apply(null, args.concat(back));  
    };
};

// 引数の順序を逆にした関数を返す
Function.prototype.mirror = function() {
    var self = this;
    return function() {
        return self.apply(null, Array.prototype.reverse.call(arguments));  
    };
};

// 渡された引数をthisとしてバインドした関数を返す
Function.prototype.methodOf = function(obj) {
    var self = this;
    return function() {
        return self.apply(obj, arguments);
    };
};

// 第一引数にthisを取る関数を返す
Function.prototype.uncons = function() {
    var self = this;
    return function() {
        return self.apply(arguments[0], Array.prototype.slice.call(arguments, 1)); 
    };
};

firefox3でしか確認してないけどまあ普通に動くと思う。
gist: gist:124852