値、プロパティ、そしてオブジェクト
オレのためのJavaScript入門、その4
JavaScriptは式で構成され、値は式から生まれる。そしてプロパティという殻を与えられた値のみが生き残ることができる。これが前回の内容。しかしこの説明の中にはオブジェクトという言葉は出てこなかった。式で扱うものは値である。当然プロパティに納めることができるものは値のみ、ということになる。ではJavaScriptにおいてオブジェクトとは一体どのようなものなのだろうか。
実のところ式の中でオブジェクトを扱う手段は一つだけである。これはつまり、JavaScriptではオブジェクトを扱う方法が一つしかない、ということでもある。
JavaScriptにおいてオブジェクトに対して行える唯一の操作、それは「オブジェクトの生成」である。
最も基本的なオブジェクトの生成方法を記す。
新しいオブジェクト = new Object();
この悪い冗談のようなコードの新しいオブジェクトとはプロパティ名である。それなら素直にプロパティ名 = new Object();
とした方が混乱も少なくて済みそうなものだが、ここでは話をややこしくするためにわざとそうしてみた。料理にはスパイスが必要である。
このコードではまず新しいオブジェクトを生成し、新しいオブジェクトという名のプロパティ(←この辺がややこしい)にそのオブジェクトを参照するobject種の値を代入している。new演算子の機能やらその後に続く関数呼び出しとの関係やらについてはとりあえず今は保留する。要するにnew演算子とはオブジェクトを生み出す魔法の呪文みたいなものなのだが、とりあえずここでは新しいオブジェクトという名のプロパティに新しいオブジェクトを参照するobject種の値が代入された、ということだけわかればよい。
このnew Object()
で生成されるオブジェクトはJavaScriptにおけるオブジェクトというものの原型とも言えるもので、これは何の特徴も持たないオブジェクトである。(あらかじめ特徴を持たせる方法もあるのだが、ここでは触れない)
「何の特徴も持たない」からといって、しょぼくれた30過ぎの冴えないサラリーマンみたいなものを想像されては困る。このサラリーマンは単に「平凡」なだけであり、その平凡さこそが彼の持つ特徴なのである。勝手に失礼な想像をしてはいけない。無論彼と私とは何の関係もない。ここでいう「何の特徴も持たない」とはサラリーマンであるかどうかはもとより、そもそも人間であるかどうかすらもわからない、文字通り何の特徴も持たない状態のことである。
さて、これでは何もしたことにはならない。何の特徴も持たない「ナンダカヨクワカラナイモノ」ができただけだけである。
そこでこの「ナンダカヨクワカラナイモノ」に特徴をつけてやることにする。
新しいオブジェクト.種別 = '人間';
新しいオブジェクト.職業 = 'サラリーマン';
新しいオブジェクト.年齢 = '30過ぎ';
...(ry
まあ結局しょぼくれた30過ぎの冴えないサラリーマンなんだが、この際そんなことはどうでもいい。
これは何をしているのかというと、プロパティに値を代入しているのである。見たまんまである。
だがこれではオブジェクトがどういうものなのかよくわからないだろう。
テーブルの上にいくつかのお皿が乗っていて、それぞれのお皿には料理の写真が入っている。少々シュールな光景だが、そんなイメージを想像していただきたい。
ここで「料理の写真」とは実体化していない値を表す。「お皿」はプロパティだ。お皿には名前が書いてあり、これがプロパティ名にあたる。プロパティに収められた値が式の中で評価されるときはこの写真を基に料理が実体化され演算子に食われる。料理を食った演算子はその味を基に新しい料理を作り出し、必要があればその写真を撮ってお皿に移す、というわけだ。
よく見てみるとテーブルにも名前が付いている。中華料理屋なんかで誰も来ないのに店主が見栄を張って「予約席」とか書かれた札を置く、みたいな感じだ。さらに周りを見渡すと、同じようなテーブルがいくつかあり、それぞれに別の名前が付けられている。
再びテーブルの上に目を移すと、料理の写真ではないものが入っているお皿がある。どうやら何かの名前が書いてある紙ようだがよく読めない。そしてその名前はプロパティ名ではないようだ。
この辺で大体察しが付いただろう。「テーブル」とはオブジェクトのことであり、「何かの名前が書いてある紙」とはobject種の値である。
function種も似たようなものだと思ってよい。ただ「何かの名前が書いてある紙」に書いてある名前の示すものがテーブルではなく「事務机」みたいなものであり、お皿にはその紙以外に何か呼び鈴のようなものが入っている。詳しくはまた別のエントリーで説明する(予定)。
このイメージで上のコードを説明をしてみる。
まずnew Object()
で新しいテーブルが生成される。このテーブルの上には何も乗っていない。次に新しいオブジェクトというお皿にこの何も乗っていないテーブルに付けられた名前の書かれた紙が入れられる。
次の行には.(ドット)演算子が出てくる。ここで.(ドット)演算子というものを簡単に説明しておく。
.(ドット)演算子の左辺に置くことができるのはobject種の値のみであり、右辺に置くことができるのはプロパティ名のみ(カッコ付きプロパティ名も含む)である。そしてこのとき.(ドット)演算子を囲む2つの値は、左辺のobject種の値が参照するオブジェクトの持つ右辺のプロパティ名のプロパティ、という一つの値として扱われる。
つまり新しいオブジェクト.種別 = '人間';
とは、'人間'という料理(=string種の値)の写真を撮って、それを新しいオブジェクトと書かれたお皿(=プロパティ)に入った紙(=object種の値)に示されたテーブルの上にある種別と書かれたお皿(=プロパティ)に入れる、ということである。
以下の行も同様だ。
「オブジェクト」とは簡単に言ってしまうと「0(ゼロ)個以上のプロパティを持つもの」である。上のイメージで言い換えると、「オブジェクト」とは「プロパティ」というお皿を乗せるテーブル、なのである。
初めに、オブジェクトを扱う手段は生成しかない、と書いた。新しいテーブルを作ることはできるが、そのテーブルを揺らしたりひっくり返したりすることはできない、ということだ。もちろんテーブルを消すこともできない。テーブルはテーブルとしてそこに存在するだけである。(これが「残り湯は、犬も食わねえ」のココロだ) ではテーブルをそのテーブルたらしめているものは何か。それはテーブルに乗ったお皿である。
つまりテーブルに乗ったお皿とはそのテーブルを特徴付けるものである、と言うことができる。お皿やそのお皿の中身は式によって自由に扱うことができる。そしてテーブルの上のお皿やそのお皿の中身を操作することによってそのテーブルに意味を持たせてやるのである。
この意味を持ったテーブル、これこそが「オブジェクト」なのである。
以下は蛇足だ。
「値」とは具体的なものであり、わかりやすい。反対に「オブジェクト」はものすごく漠然としたものである。それ故に様々な扱い方が可能である。いや、「様々」という表現では生ぬるい。それこそ「無数」の扱い方ができる。
JavaScriptではオブジェクトを使うことによって同じデータ構造に対して様々な表現が可能になる。それは「自由」で「個性的」な表現と言えるかもしれない。そしてもしかしたらこれこそがJavaScriptを使うことの最大の魅力かもしれない。現実はオブジェクトの扱いを型にはめようとして皆必死なようだがね。
さて、前回と今回の説明では端折ってしまった部分があまりにも多い。次回からはその辺の穴埋めをしていこうと思う。
PR