2008年5月14日水曜日

JavaScript のハッシュとオブジェクト

ハッシュ

JavaScript の基本は「ハッシュ」。

 {キー:値}

var obj = {'name':'太郎', 'age':18, 'address':'東京'};

上記 obj は、ハッシュのキーによる呼出し、 obj['name'] によって値 「太郎」 を取得できる。一般的なオブジェクト指向言語のプロパティのように、 obj.name によっても値 「太郎」 を取得できる。

(cf. Using Object Initializers - MDC の 「オブジェクト初期化子の使用」 )

プロパティは動的に追加できる。これは新しくハッシュにキーと値を追加したのと同じこと。上記 obj の定義後に、

obj.weight = 60;

とすると、あたかも実行時にオブジェクトの属性が新たに追加されたように見えるが、ハッシュを格納した変数 obj にキー weight : 値 60 の項目を追加したに過ぎない。

Core JavaScript 1.5 Guide:Objects and Properties - MDC によると、

JavaScript におけるプロパティと配列は密接に関連しています。事実、それらは同一のデータ構造への異なるインタフェースなのです。

追記(2008.9.4) : cf. JavaScript でキー入力に応じて HTML の要素の値とスタイルを変化させるのコメントを参照。

 

関数

ハッシュの値 (オブジェクトのプロパティ) として 「関数」 を入れることもできる。

obj.hello = function(){return 'こんにちは、' + this.name + 'です。'};

obj.hello(); // こんにちは、太郎です。

上記は無名の関数を定義したところ。

関数を呼出すときは

()

を忘れないように。 () がないと、関数自身を指すことになる。

this

は関数を持つオブジェクト自身を指す。関数を保持するオブジェクトによって変化する。

注意すべきは、関数がオブジェクトに対して定義されていること。 Java のクラスのように、生成するオブジェクトの雛形として関数を定義しているわけではない。

obj.hello() 

obj['hello']() 

でも呼出せる。 () が関数を評価するという意味があるようだ。

 

コンストラクタ関数

オブジェクトの初期化子とは異なる方法でオブジェクトを生成することができる。下記はコンストラクタ関数を利用して、オブジェクトを生成。この書き方は Java のようにクラスを定義して、オブジェクトを作るのに似ている。

function Obj(name, address, age){
    this.name = name;
    this.address = address;
    this.age = age;
}

var a = new Obj("Tarou", "Tokyo", 20);

追記(2008.9.4) : コンストラクタ関数の覚え方。普通に関数を書くように書く。ただし、ローカル変数を this で修飾するだけ。関数名がクラス名に相当する。


prototype

コンストラクタ関数 Obj から生成したオブジェクト全てに作用するプロパティを追加したい場合は、 prototype を利用する。クラスベースのオブジェクト指向言語におけるクラス定義の方法を真似ている。

先ほどの Obj にプロトタイプのプロパティ hello に関数を定義してみる。

Obj.prototype.hello = function(){
   return "こんにちは、" + this.name + "です。" ;
        }
a.hello();

 

関連記事