JavaScriptのオブジェクトシステムについての、現時点での私の理解

JavaScriptでは全てのデータをオブジェクトで表現できる

通常はリテラル(スクリプト文中に直接データを書き込んだもの)で表現するデータを、JavaScriptではオブジェクトとしても表現できるようになっています。(厳密にはリテラルで書いたデータとオブジェクトで書いたデータは異なるものですが、その説明は省略)

リテラルで表現した場合と、オブジェクトとして表現した場合の比較
  リテラルで表現した場合 オブジェクトとして表現した場合
数値 100 new Number(100)
文字列 "fuga" new String("fuga")
真偽値 true new Boolean(true)
配列 ["foo","bar"] new Array("foo","bar")
正規表現 /fuga/ new RegExp("fuga")
オブジェクト {} new Object()
関数 function(foo) {alert(foo)} new Function("foo","alert(foo)")

プロパティについて

オブジェクトはその内部にプロパティを持つことができます。オブジェクト名とプロパティ名をドットで繋げることプロパティを呼び出せます。
例えば Array オブジェクトは length というプロパティを持ち、オブジェクト名.lengthとすることで、この配列オブジェクトの持つ要素の数を取り出すことができます。

var hoge = new Array("foo","bar");
alert(hoge.length) // 2 が表示される

length のようなものは Array オブジェクトに最初から組み込まれているプロパティなので、特に自分で定義しなくてもいきなり使うことができます。もちろん自分でプロパティを作ることもできます。

プロパティを作るには、作成したオブジェクトに .(ドット)を付けてプロパティを定義します。

var hoge = {};
hoge.x = 100;
alert(hoge.x); // 100 が表示される

もしくは、オブジェクトを作成する際にオブジェクトリテラル形式で定義します。

var fuga = {x: 100, y: 50}
alert(fuga.x + fuga.y); // 150 が表示される

コンストラクタとインスタンス

「オブジェクトで表現した」場合、new XXX()という文になりますがこれはXXX()というコンストラクタから新たなオブジェクトを作る、という意味となります。コンストラクタとは新たなオブジェクトを作る雛形のようなものであり、コンストラクタから作られたオブジェクトをインスタンスと呼びます。

JavaScriptでは関数をコンストラクタとして使うことができます。関数を定義する際、this.XXXという書き方でプロパティを定義しておくと、そのプロパティはインスタンスにも引き継がれます。

// hoge()コンストラクタを作成
// hoge()のプロパティとして x=100 を定義
function hoge() {this.x = 100;}
// hoge()コンストラクタからfugaオブジェクトを作る
// fugaオブジェクトはhoge()コンストラクタのインスタンスとなる
var fuga = new hoge()
// hoge()コンストラクタから x=100 プロパティが
// 継承されているので 100 が表示される
alert(fuga.x)

今回はこの辺までで。
prototypeチェーンについてはまだ勉強中・・・。

JavaScriptがあんまりおもしろいので、昨年秋に『JavaScript 第5版』(通称「サイ本」)を買いました。ちまちま読んではいるのですがいまだに三分の一程度しか目を通せていない状況だったりします。

hamashun.comの中の人(※)が、プログラム勉強ブログと題してはてなダイアリーを書いてらっしゃるのを見て、私も何かアウトプットしなくてはならない気分になり、この記事を書いてみました。もし内容に誤りを発見しましたら、お気軽にコメントやブックマークコメントなどで馬鹿にしていただけるとありがたいです。

この記事を書くにあたってのソースは、サイ本と『Ajax入門』あたりです。最初、『Ajax入門』を読んだ時はかなりちんぷんかんぷんで「入門とか書いてあるクセに難しい本」という印象でした。しかしサイ本を読んである程度勉強してからあらためて読み直したら、内容が理解できて、本の印象が全く変わって驚きました。まぁこちらも、隅から隅まで読んではいないのですが・・・。何にしろ、まだ勉強中です!

最近私はこの方を勝手にライバル視しています(謎)

Leave a Reply

Your email address will not be published. Required fields are marked *

*
*