JS におけるオブジェクトとは

周知の話の繰り返しとなってしまいますが、ちょっと基本に立ち返ってみたいと思います。

JSON (JavaScript Object Notation) というものがあります。JS のオブジェクト記法に基づいたコード受け渡しの仕組みですが、ここではその記法そのものを見ていきます。これが理解できると (難解な) prototype.js も読み解けるようになる、という重要な項目です。

var obj = {
  key1: value1,
  key2: value2
};

これが、オブジェクトの定義です。言語によっては連想配列、辞書配列、ハッシュなどと呼ばれているものと同じです。[] ではなく、{} を使って定義するのが配列と違う点ですね。

内部は、キーと値のペアをコロンで分けるという形です。

コロンの左側はプロパティー (インスタンス変数) やメソッドの名前となる文字列です。これは裸でも引用符で括ってもかまいません。括ってあれば中にスペースが入ったりしても大丈夫です。

右側は値、と言うか任意の expression です。それが関数「定義」であればメソッドになりますし、関数「呼び出し」であれば変数になるわけです。

また、オブジェクトが内部で自分自身を指すキーワードというものがあり、JS においては this を用います:

obj.key3 = function () {
  alert(this.key1);	  // 自身のプロパティーへのアクセス
  return this;		  // オブジェクトそのものへの参照
};

ドット記法によって簡単に既存のオブジェクトを拡張できる点にも注目です。

これが基本であり全てだと思います。ここで、次の例を見ていただきましょう。

var testArr = {
  0: 'a',
  1: 'b',
  2: 'c'
};

alert(testArr[0]);  // => 'a' を表示

オブジェクトとして定義したものを配列としてアクセスしています。これが問題なく "a" を表示するんですね。

つまり、JS においては、配列は内部的にオブジェクトとして実装されていることがわかります (オブジェクトの各要素にアクセスするための for...in 文が配列にも使えるのはこのためです)。

したがって、逆に、配列として定義したものをオブジェクトとしてアクセスすることも可能です:

var testObj = [ 'a', 'b', 'c' ];

alert(testObj.0);     // エラー。0 は有効な変数名ではないため
key = '0';
alert(testObj[key]);  // => 'a' を出力

以上です。次回はクラス定義について考えます。