第 8 章 DOM 67
B.4 オブジェクト
B.4.1 オブジェクトの基礎
オブジェクト(object)は、「組」(pair)と呼ばれるものが集まってできている集合です。
組は、「プロパティー」(property)と呼ばれるデータと「値」(value)と呼ばれるデータとを対 応させたものです。プロパティーにすることができるのは文字列または数値で、値にすることが できるのは任意のデータです。ひとつのオブジェクトの中にある個々の組は、プロパティーによっ て識別されます。
JavaScriptで「オブジェクト」と呼ばれているものは、一般的には「連想配列」(associative
array)と呼ばれるものです。同じように、「プロパティー」は一般的には「キー」(key)と呼ばれ
ます。
B.4.2 オブジェクト初期化子
オブジェクトは、「オブジェクト初期化子」」(object initializer)と呼ばれる式によって生成す ることができます。オブジェクト初期化子は、次のような構文です。
{ プロパティー設定,
...
}オブジェクト初期化子を評価すると、その中に書かれたそれぞれのプロパティー設定によって 作られた組から構成されるオブジェクトが生成されて、そのオブジェクトが、オブジェクト初期 化子の値になります。
プロパティー設定は、次のような構文です。
プロパティー名: 式
「プロパティー名」のところには、識別子、文字列リテラル、数値リテラルのいずれかを書き ます。プロパティー名として識別子を書いた場合、それは、その識別子を値とする文字列リテラ ルと同じ意味だと解釈されます。たとえば、takoというプロパティー名は、"tako"と同じ意味 だと解釈されます。
B.4. オブジェクト 109 プロパティー設定は、プロパティー名から求められた文字列または数値をプロパティー、そし て式を評価して得られた値を値とする組を作ります。たとえば、
{ namako: null, "<==": true, 8: "umiushi" }
というオブジェクト初期化子を評価すると、プロパティーがnamakoで値がnullという組、プロ パティーが<==で値がtrueという組、プロパティーが8で値がumiushiという組から構成され るオブジェクトが生成されて、そのオブジェクトがこのオブジェクト初期化子の値になります。
B.4.3 プロパティーからの値の取得
オブジェクトaのプロパティーbから値を取得したいときは、a[b]という形の式を書きます。
たとえば、
{ x: 33, y: 55, z: 77 }
というオブジェクトがhitodeという変数に設定されているとするとき、
hitode["y"]
という式を評価すると、55という値が得られます。
プロパティーbが識別子の構文を満足している場合、a[b]という式は、a.bと書くこともで きます。ですから、先ほどの式は、
hitode.y
と書くことも可能です。
B.4.4 プロパティーへの値の設定
オブジェクトaのプロパティーbに値cを設定したいときは、a[b] =cという形の式を書きま す。たとえば、
{ x: 33, y: 55, z: 77 }
というオブジェクトがhitodeという変数に設定されているとするとき、
hitode["y"] = 99
という式を評価すると、hitodeの値は、
{ x: 33, y: 99, z: 77 } に変わります。
プロパティーbが識別子の構文を満足している場合、a[b] =cという式は、a.b=cと書くこと もできます。
B.4.5 プロパティーの追加
オブジェクトaにプロパティーbが存在していないときにa[b] =cを評価すると、新しいプロ パティーとしてbがaに追加されて、cがその値になります。
B.4.6 プロパティーの削除
プロパティーを削除したいときは、演算子のdeleteを使います。たとえば、
delete hitode["z"]
という式を評価すると、hitodeというオブジェクトが持っているzというプロパティーが削除 されます。この式は、
delete hitode.z と書くことも可能です。
B.4.7 すべてのプロパティーへのアクセス
オブジェクトが持っているすべてのプロパティーにアクセスしたいときは、for-in文を使い ます。たとえば、
{ x: 3, y: 5, z: 7 }
というオブジェクトがtakoという変数に設定されているとするとき、
110 付録B JavaScript for (var i in tako) tako[i] *= 2;
というfor-in文を実行すると、takoの値は、
{ x: 6, y: 10, z: 14 } に変わります。
B.4.8 コンストラクタ
オブジェクトは、newという演算子を使うことによって生成することも可能です。newの右側 には、通常、「コンストラクタ」(constructor)と呼ばれる関数を呼び出す式を書きます。
コンストラクタというのは、newによって生成されたオブジェクトを初期化するために使われ る関数のことです。コンストラクタの名前は、通常、先頭を大文字にします。newは、自分が生 成したオブジェクトをthisにしてコンストラクタを呼び出します。たとえば、
function MyObject(arg) { this.myproperty = arg; } という関数宣言でMyObjectというコンストラクタを定義して、
new MyObject(307)
という式でオブジェクトを生成したとすると、プロパティーがmypropertyで値が307という組 が、そのオブジェクトの中に作られます。
B.4.9 メソッド
メソッド(method)というのは、関数が設定されたプロパティー、またはプロパティーに設定
された関数のことです。たとえば、
function MyObject() {
this.mymethod = function(a) { return a*100; };
}
というコンストラクタを定義して、
var myobject = new MyObject();
という変数文でオブジェクトを生成したとすると、そのオブジェクトは、mymethodという名前 のメソッドを持つことになります。このメソッドは、
myobject.mymethod(53)
というような式で呼び出すことができます。
B.4.10 プロトタイプオブジェクト
関数は、prototypeという名前のプロパティーを持っています。そのプロパティーに設定され ているオブジェクトは、「プロトタイプオブジェクト」(prototype object)と呼ばれます。
prototypeプロパティーには、暗黙のうちにデフォルトのプロトタイプオブジェクトが設定さ
れていますが、デフォルトのものとは別のオブジェクトをプロトタイプオブジェクトとして設定 してもかまいません。また、デフォルトのプロトタイプオブジェクトに対してプロパティーを追 加する、ということも可能です。
デフォルトのプロトタイプオブジェクトは、constructorというプロパティーを持っていて、
そこには関数自身が設定されています。
コンストラクタによって初期化されたオブジェクトは、そのコンストラクタが持っているプロ トタイプオブジェクトのプロパティーに対して、あたかもそれが自分自身のプロパティーである かのようにアクセスすることができます。たとえば、
function MyObject() {}
という関数宣言でMyObjectというコンストラクタを定義して、
MyObject.prototype.who = function() { alert("MyObject"); };
という式文で、MyObjectのプロトタイプオブジェクトにwhoというメソッドを追加して、
var myobject = new MyObject();
という変数文で、MyObjectで初期化されたオブジェクトをmyobjectという変数に設定したと します。このとき、whoは、
B.5. グローバルオブジェクト 111