Hatena::Groupjavascript

emergentのJavaScript入門日記

 | 

2008-10-29

callとapply

01:24 | callとapply - emergentのJavaScript入門日記 を含むブックマーク はてなブックマーク - callとapply - emergentのJavaScript入門日記

例えば、2つの引数を使用する関数f()を、オブジェクトoのメソッドであるかのように呼び出す場合、

以下の3つのコードはほぼ同じ意味。*1

o.m = f;
o.m(1,2);
delete o.m;
f.call(o, 1, 2);
f.apply(o,[1,2]);

callは関数fの引数を第2引数以降に並べるのに対し、applyは第2引数に関数fの引数の配列を渡す。

調べた理由

MinibufferなどのGreaseMonkeyスクリプトを読んでいると、以下のような定義がよく出てくるから。

var Class = function(){return function(){this.initialize.apply(this,arguments)}}

ちなみに、argumentsプロパティは、関数に渡された引数の配列

こう定義しておけば、クラスの定義するときに、例えばこれまで

var Hoge = function(m) { this.m = m; }
Hoge.prototype = {
    fuga: function() {
        return this.m * this.m;
    }
}

と書いていたのを、

var Hoge = Class();
Hoge.prototype = {
    initialize: function(m) {
        this.m = m; /* ここの右辺はarguments[0]でもよい */
    },
    fuga: function() {
        return this.m * this.m;
    }
}

というように、initializeメソッドとしてコンストラクタを記述できるようになるからだと理解。

ぐぐってみたら

prototype.jsで似たようなものが実装されているんだねぇ。

*1:出典:オライリー JavaScript

 |