概要
JavaScriptの世界で、「オブジェクト」は重要なキーワード。であると同時に、指し示す範囲が曖昧で、よく観察すると文脈によって少し違う意味で使われていたりする。この違いを整理してみたい。
ざっくり言うと、オブジェクトには広義のオブジェクトと狭義のオブジェクトがある(これは正式な呼び方ではない)。一般にオブジェクトというときは広義の意味で使われていることが多いが、チュートリアルなどでは最初に狭義の方が出てくるケースもよくあるので、初心者のうちはややこしいと思う。
2つの意味をそれぞれ簡潔にまとめると、以下のようになる。
広義のオブジェクト:プロパティとメソッドを持つデータ構造(データと機能をひとまとめにしたもの)
狭義のオブジェクト:連想配列、Objectオブジェクト
図で書くと、こんな感じ。
つまり、広義のオブジェクトの中にStringオブジェクトやArrayオブジェクトなど、いろいろな種類があって、その一つが狭義のオブジェクトであるObjectオブジェクトという構図になっている。日常的な例でいうと「ごはん」という言葉に広義のごはん(食事)があって、その中に狭義のごはん(炊いた米)が含まれるというのと似ているかも。
広義のオブジェクト
それぞれのカテゴリについて詳しく見ていくと、まず広義のオブジェクトは以下のような共通点を持つデータ構造のことと言える。
newキーワードで作れる
よく使われるのはnew Date()でDateオブジェクトを作るというもので、たとえば、現在日時を表すdという変数を作りたいなら
const d = new Date();
とすればいい。
また、これと同じように
const str = new String('hello');
としてstrというStringオブジェクト(≒ 文字列)を作ることができる。この書き方で文字列を作るのは推奨されていないが、単にconst str = 'hello';と書く代わりに、このような表現もできることは覚えておいていいと思う。
続けて.プロパティ名や.メソッド名と書くと、値や関数にアクセスできる
例として、
const arr = [24, 18, 35];
のような配列があった場合を考えよう。配列はArrayオブジェクトとも呼ぶことができて、上の[24, 18, 35]の部分はnew Array(24, 18, 35)とも書ける。そして、この配列(= Arrayオブジェクト)の要素数の情報はlengthプロパティとしてアクセス可能になるので
arr.length
とすれば、arrにいくつ要素が格納されているか調べられる。
また、上の例で作ったdの3分後を表すDateオブジェクトが欲しいときは、分の値を設定するsetMinutes()メソッドと分の値を取得するgetMinutes()メソッドを使って
d.setMinutes(d.getMinutes() + 3);
と書けばいい。
狭義のオブジェクト
一方、狭義のオブジェクトつまりObjectオブジェクトは、上で説明した一般的なオブジェクトの機能に加えて、いくつか独自の機能を兼ね備えたオブジェクトを指す。
最も特徴的なのは、オブジェクトを作るときに
{suzuki: 47, sato: 38}
のように波括弧{}とセミコロンを使って、自分でプロパティを設定できる点かと思う。Objectオブジェクトは、このようなプロパティの名(上の例でいうとsuzukiやsato)をキーとして、プロパティの値(上の47や38)にアクセスできることから、連想配列とも呼ばれている。
ただ、Objectオブジェクトは広義のオブジェクトの一つでもあるので、Dateオブジェクトなどと同じようにnewキーワードを使って生成できたりする。たとえば、
const obj = new Object();
とすると、
const obj = {};
と書いたのと同じ意味になる。new Object()もnew Array()などと同様に使う機会は少ないが、以上のような例から、Objectオブジェクトも配列(= Arrayオブジェクト)も広い意味で「オブジェクト」の仲間、という感覚が掴めればよいと思う。
ちなみに、JavaScriptのObjectオブジェクト(= 連想配列)に当たるデータ構造には、他の言語だともう少し分かりやすい名前がついていることが多く、たとえばRubyにはハッシュ、Pythonにはディクショナリという概念がある。JavaScriptにも、そういう用語があったらもっと分かりやすい気がするのだけど…。
