Classオブジェクト
【抜粋】 var Class = { create: function() { return function() { this.initialize.apply(this, arguments); } } }
構造解析
createメソッドは、自オブジェクトのinitializeメソッドを呼び出す無名関数を返却します。つまり、以下の2つは同じ意味です。
【例】 var Test = Class.create();
【例】 var Test = function() { this.initialize.apply(this, arguments); }
initializeメソッドは個別に追加する必要があります。具体的には以下のようにします。
【例】 var Test = Class.create(); Test.prototype = { initialize : function(arg){ : : } }
これを参考サイト「オブジェクト指向プログラム言語としてのJavaScript」の記法に合わせると以下になります。
【例】 function Test(){ this.initialize.apply(this, arguments); } function Test_initialize(arg){ : : } Test.prototype.initialize = Test_initialize;
コンストラクタ扱いのTest関数がinitializeメソッドに処理を丸投げしているのは、後述するクラス継承時にコンストラクタの処理も継承させるためです。(Test関数の処理は継承できないが、initializeメソッドは継承できる。)
なぜapplyメソッドが使用されるか
applyメソッドは既存Functionクラスの既存メソッドです。関数はFucntionクラスのインスタンスです。
【抜粋】 this.initialize.apply(this, arguments);
上記の文のおおよその意味は、「自オブジェクトのinitializeメソッドを呼び出す。自オブジェクトのプロパティ・メソッドを使用し、呼び出し元からの引数をそのまま引数とする。」となります。ただ、自オブジェクトのメソッドが、自オブジェクトのプロパティ・メソッドを使用できるのは明らかで、あまり意味がないよう思えます。実際そのとおりで、この場合、重要なのは第二引数のほうです。argumentsで取得した引数の配列を、そのまま関数の呼び出しに使用できるという点を利用しているのです。
【例】 var Class = { create: function() { return function() { //apply()を使用せずにinitializeメソッドを呼び出すと・・・ this.initialize(arguments); } } } var Test = Class.create(); Test.prototype = { initialize: function(msg) { //"[object Object]"と表示される。 alert(msg); //"hello!"と表示される。 alert(msg[0]); } } var test = new Test("hello!");
【参考サイト】 オブジェクト(Object)