uhyohyo.net

JavaScript初級者から中級者になろう

一章第一回 オブジェクトとは

このページの最終更新日:

オブジェクト

JavaScriptではとても重要な要素であるオブジェクトですが、初心者の人はこれをあまり知りません。これを知ることが「中級者」への第一歩だといえるでしょう。

さて、オブジェクトとは、複数の値をひとまとめにした値です。これはひじょうにざっくりした説明ですが、今はこれくらいにしておきましょう。

実はこの説明は、基礎第六回で解説した配列と同じ説明です。実は配列はオブジェクトの一種なのですが、それについては深く考えずにまずはオブジェクトとはどんなものかを説明します。

配列は、複数の値(要素といいました)をひとまとめにし、それぞれを番号で区別するというものでした。

一方、オブジェクトでは、ひとつひとつの値が番号ではなく名前を持っています

具体的なサンプルを見てみましょう。

var obj = new Object();
obj.aaa = "test";
obj.b = 123;
alert(obj.aaa);
alert(obj.b);

「test」「123」が表示されます。

最後の2行では、「obj.aaa」「obj.b」というものを表示しています。

さて、この場合変数objがオブジェクトです。変数objに代入している文は、次のようになっています。

var obj = new Object();

このnew Object()がオブジェクトを作成する式です。配列のときはnew Arrayでしたね。「new」は実は演算子の一種で、「新しいオブジェクトを作る」という意味です(newについて詳しくは第九章で説明します)。

さて、こうしてできる新しいオブジェクトは、実は値を1つも持っていません。中身がない状態です。しかし、新しい値をオブジェクトに追加することができます。それが、次の2文です。

obj.aaa = "test";
obj.b = 123;

obj.aaaobj.bに何の変哲もない値を代入しています。これは、配列のときでいうarr[0]みたいなノリで、「objの中のaaaという名前の値に"test"を代入する」みたいな意味になります。

先ほどオブジェクトは値を1つも持っていないと述べました。オブジェクトは柔軟なので、objはもともとaaaとかbとかいう値を持っていなかったのですが、代入しようとした時点で自動的に作成されます。

もちろん、次のように、すでにある値に再び代入して値を変えることもできます。

var obj = new Object();
obj.aaa = "test"; // ←ここでaaaという名前の値をobjに作成
alert(obj.aaa);
obj.aaa = "foo"; // ←ここですでにあるaaaの値を書き換える
alert(obj.aaa);

このような、オブジェクトが中に持っている値のことをプロパティといいます。きわめて基本的な言葉なので、ぜひ頭に入れておきましょう。

さて、このプロパティの表し方を改めて書くと、次のようになります。

オブジェクト.プロパティ名

オブジェクトとプロパティ名が「.」(ピリオド)でつながっています。

つまり、上のサンプルで「obj.aaa」は「オブジェクトobjのプロパティaaa」、「obj.b」は「オブジェクトobjのプロパティb」を表していたことになります。これらは、上で見たように、普通の変数と同じように扱う、すなわち代入したり値を取得したりすることができます。

ただし、新しいプロパティを作るときであっても、新しく「変数」を作っているわけではないので、代入するときに「var」はつけません。

また、プロパティの表し方には別の書き方があります。次のような書き方です。

オブジェクト名["プロパティ名"]

オブジェクトのあとに[ 〜 ]でプロパティ名を囲んでくっつけています。しかし、ここで注意してほしいのが、今回はプロパティ名が文字列だということです。

つまり、obj.aaaobj.bobj["aaa"]obj["b"]のようにも書けるということです。この形は、プロパティ名が変数に入っている場合などに役立ちます。

また、この書き方は基礎第六回で紹介した配列変数の添字の書き方と同じですね。実は、配列変数も特殊なオブジェクトなのです。つまり、arrを配列としたとき、arr[0]はarrの0番目の要素と紹介しましたが、実はarrの「0」という名前のプロパティを参照していたのです。ただし、注意すべきことは、このように数字だけの名前のプロパティは、arr.0の形で書けません(文法エラーになります)。arr[0]の形でのみ参照できます。

さらに、理解度の高い人はある不自然さに気づいたことでしょう。先ほど[ ]の中身は文字列であると紹介したのに、0は文字列ではなく数値です。このような場合、文字列が必要な場面で数値が渡されたことになるので、数値は文字列に変換されます。すなわち、arr[0]とはarr["0"]と同じ意味となります。

しかし、配列を扱う場合、添字が数値であるという理解のほうが分かりやすいため、いちいちarr["0"]などと書かずにarr[0]と書かれるのが普通です。

なお、arr.lengthで配列の長さが得られますが、これも配列のlengthというプロパティを参照しているという理解ができます。配列はオブジェクトとしては特殊なので、配列が操作されるとプロパティlengthが自動で書き換わるのです(実はこの説明も厳密には正しくないのですが、そういうものだと思っておきましょう)。

とりあえず、オブジェクトの基礎の解説はこれで終了します。