JavaScript ではオブジェクトは非常に重要です。オブジェクトにはじまり、オブジェクトに終わる、というくらいにオブジェクトを理解しておかないと話になりません。
配列を定義するには角かっこの記号を使いました「 [] 」このようなものでした。配列リテラルと呼ぶものです。
オブジェクトは、大かっこの記号を使います「{}」このようなものです。オブジェクトリテラルと呼ばれます。
1 2 3 4 5 6 7 8 |
let object1 = { value1: 10, value2: 20, value3: 30 }; console.log(object1.value1); // 10 と表示される console.log(object1.value2); // 20 と表示される console.log(object1.value3); // 30 と表示される |
value1というオブジェクト内に取り込まれた変数を「プロパティ」と呼びます。
上記のコードはこのように書くこともできます。
1 2 3 4 |
let object1 = {}; object1.value1 = 10; object1.value2 = 20; object1.value3 = 30; |
let で、object1 に「空オブジェクト」を作り出して、value1 プロパティを定義して 値を代入しているということになります。
多段階のオブジェクト
オブジェクトのプロパティの中にさらに、オブジェクトを入れることができます。入れ子にする、という風に表現されます。
1 2 3 4 5 6 7 8 9 10 11 |
let object1 = { ovject1_1: { value1_1_1: '1-1-1', value1_1_2: '1-1-2' }, object1_2: { value1_2_1: '1-2-1', value1_2_2: '1-2-2', }, value1_3: '1-3' }; |
オブジェクトもいれることができるし、値も同時にいれることができます。
連想配列的使い方
オブジェクトのプロパティは、そのプロパティの名前、を文字列で指定することができます。次の例で示します。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
// 連想配列的例1 let object1 = { value1: '値1', value2: '値2', value3: '値3', }; console.log(object1['value1']); // 値1が表示される。 // 連想配列的例2 let array1 = ['value3', 'value2' 'value1']; console.log(object1[array1[0]]); // 値3が表示される。 console.log(object1[array1[1]]); // 値2が表示される。 console.log(object1[array1[2]]); // 値1が表示される。 |
連想配列的例1 では、文字列で value1 を指定しています。連想配列的例2 で、これを応用していた array1 に 文字列として value1 value2 value3 を格納しておいて、その文字列によって、object01 の値を取得しています。
JavaScript ではオブジェクトの機能としてこのようなことができます。ところがいくつかの他言語ではオブジェクトではこのようなことができません。
なので、オブジェクトとは別のものとして、「連想配列」と呼ぶものを利用して、名前と値を組み合わせてデータを保持する仕組みを利用することが行われてきました。
その慣例から、JavaScript で、「連想配列はこのように使う!」というテクニックが紹介されていることがあるのですが、実際のところは、JavaScriptには「連想配列」という仕組みがあるわけではなく、オブジェクトのひとつの使い方、にすぎないものです。なので、「連想配列」ときけば、オブジェクトのことだな、と理解しておいてください。
private属性は実装しにくい
この段落は、すでに他言語を知っている方向けの説明になります。プロパティのprivate属性やpublic属性についてです。プロパティの属性に知らない人はこの段落は気にしないでください。
JavaScriptのオブジェクトでは、private を実装するのがかなりややこしいことになります。できなくはない感じだけど、かなり....ということです。
それゆえに、みなが困っているために、解決策はあります。JavaScript業界では、慣習的に、先頭にアンダーバー記号「_」を使った変数を private 属性として考えようという文化になっています。
1 2 3 4 |
let object1 = { _value1: 'privateな値(として考える)', value1: 'publicな値', }; |
こんな感じです。
あくまで慣習なので、private属性でもなんでもないので、 _value1 の値を、オブジェクトの外部から取得できます。
いろいろ工夫して近いことはできるのですが、結局のところ手間すぎる話が多く、private属性についてはあきらめた方が良いです。実際の所 private 属性なんて、プログラミングには不要だということを気が付かせてくれる点は JavaScript のよいところだと思います。
[JavaScript、private属性]を作ろうとして、Google検索していてください。きっと JavaScript 地獄の泥沼におちいって帰ってこれなくなると思います。歴戦の勇者たちの死屍累々の姿を見ることができるようです。私のように地獄を見たいというのなら止めませんが....
オブジェクトのメソッド
オブジェクトのプロパティに関数を設定することができて、それはプロパティというよりもむしろ「メソッド」と呼ばれるのですが、まだ、関数について説明していないので、そちらはまたどこかのちのちの機会に説明していきます。
関数も重要な概念ですし、変数に関数をいれられるということは、オブジェクトのプロパティという変数に関数を入れられる、ということにつなげられますから、まとめて説明したほうがいいでしょう。
終わりに
オブジェクトについては、こんなところです。
メソッドも先送りしてしまいましたが、更に複雑なオブジェクトを作り出す、コンストラクタ、や、クラス、という仕組みについては、また別のページで扱っていきます。