連載
» 2016年09月26日 05時00分 公開

JavaScript標準ライブラリの使い方超入門(1):JavaScriptに欠かせない「ビルトインオブジェクト」の基礎知識 (2/2)

[金城俊哉,著]
前のページへ 1|2       

「つまりライブラリのクラスを使うってことですね」(ビルトインオブジェクトの利用)

Navigator

実際にオブジェクトを使うにはインスタンス化というものを行います


Driver

「JavaやC++なんかでもクラスを使うときはインスタンス化しますが、これと同じことですか?」


Navigator

「そうです。オブジェクトの実体はプログラムコードですから、これをメモリ上に読み込んで『使える状態』にするわけですね。で、オブジェクト指向プログラミングの基本は『オブジェクトに対する操作』です。ですから、まずは使用したいオブジェクトをインスタンス化して『実体』を作っておいて、そこからメソッドやプロパティを呼び出すという流れになります


オブジェクトをインスタンス化してインスタンスの参照を変数xに格納
Driver

「インスタンス化にはnewキーワードを使うんですね。これは他の言語と同じだ」


Navigator

「ですね。で、インスタンス化したら、このインスタンスを参照するための情報を変数に代入します。メモリ上のアドレスを代入しておくというわけですね。これによって、変数名を指定することで何度でもインスタンスを参照できるようになります」


Driver

「変数には、インスタンスそのものが格納されるのではなく、インスタンスが使用しているメモリのアドレスが格納されるってことですね」


Navigator

「そうです。この点がプリミティブ型(基本型)と違うところです。インスタンス化を行うと、メモリ上に用意された領域にオブジェクトの内容が展開され、この領域のアドレスが返されてくるので、これを変数に代入するという流れになります。ということは、インスタンスを参照する変数用の領域と、インスタンス自身の領域の2つが確保されるわけですね」


Driver

「データ自身が変数によって参照されるから参照型というわけですね」


Navigator

オブジェクト指向言語は、変数によって参照されるインスタンスに対して処理を行います。JavaScriptも同様に、生成したインスタンスにデータを格納したり、格納したデータに対してメソッドを実行して様々な処理を行っていきます。関数内部の変数とは異なり、インスタンスは使用されなくなるまで存在し続けますから、必要なときに呼び出して処理が行えるうえ、同じオブジェクトからどんどんインスタンスを生成して、それぞれのインスタンスで独自の処理をしていけるのですね。

 これは、同時並行的に複数の処理が求められる現代のプログラミングにおいて重要なことなのです」


Driver

「ま、難しいことはさておき、オブジェクトからインスタンスを生成して必要な処理を行うことが、オブジェクト指向プログラミングの基本ということですね」


「プロパティ」って何ぞや

Navigator

「オブジェクトには、それ自体を定義するためのソースコードが存在します。そもそもビルトインオブジェクトは1つのプログラムなので、これを呼び出して使っているわけです。で、ソースコードの内部には、データを扱うための変数があります」


Driver

「これがプロパティというわけですね」


Navigator

「プロパティ名を指定することでデータの参照や設定を行います。重要なことですが、JavaScriptではデータを扱うのはプロパティだけです。JavaやC++などでは、プロパティを通じて変数の値を出し入れします。変数の本体は別にあって、プロパティ名を指定して間接的にアクセスしますよね」


Driver

メンバー変数とかフィールドと呼ばれているクラス専用の変数のことですよね」


Navigator

「JavaScriptにはこのような変数は存在しません。プロパティがデータそのものなのです」


プロパティとはオブジェクト専用の変数のこと。
Driver

「へー、オブジェクトって随分シンプルな構造ですね。じゃ、プロパティそのものがオブジェクトのデータと考えていいのですね」


Navigator

「そう考えてもらってかまいません。で、別の話になりますが、JavaScriptでは関数もオブジェクトとして扱います。関数には名前を付けますが、これは関数オブジェクトを参照するためのプロパティなんです」


Driver

「へぇー、関数もオブジェクトなんですね。じゃ関数を使うときもインスタンス化するんですか?」


Navigator

「いえ、関数を使うということは関数を含むオブジェクトがすでにインスタンス化されていることになりますから、改めて関数だけをインスタンス化する必要はありません」


Driver

「でも、何のオブジェクトにも属しない関数をポンって単体で作ったらどうなるんです? どこのオブジェクトにも属していませんよね」


どのオブジェクトにも属さない単体で定義された関数は、グローバルオブジェクトの関数となる。
Navigator

「もし単独で存在する関数を独自に作ったら、それは『グローバルオブジェクト』の関数として扱われます。グローバルオブジェクトとは、JavaScriptのプログラムを実行するときに暗黙的に生成されるオブジェクト(インスタンス)です。ですので、グローバルオブジェクトの関数オブジェクトであり、関数名はグローバルオブジェクトのプロパティなのです」


Driver

「何だかシンプルなようでややこしいですね」


Navigator

「グローバルオブジェクトやプロパティについては、このあとみっちりやっていきますから大丈夫です。それよりも、関数名はプロパティであるといいましたが、このようなプロパティ名で参照する関数のことを『メソッド』と呼びます」


Driver

「ってことは、JavaScriptの関数は、みんなメソッドということになりますよね」


Navigator

「基本的にそうなります。JavaScriptの関数はみんなメソッドなんです。でも、一部、あえて関数という呼び方をするメソッドもあります」


Driver

「またまたシンプルなようで何だかややこしいですね。でも、JavaScriptの関数はオブジェクトであり、関数名はすなわちプロパティである。なので『すべての関数はメソッドである』と考えることにします」


Hint スタックとヒープ

 Javaなどのオブジェクト指向言語では、参照型のデータを扱う際に、スタックとヒープという用語が出てきます。どちらもメモリ上の領域を指す用語です。スタックは、通常の変数が使用する領域で、ヒープはインスタンスが使用する領域です。

 このことからオブジェクトをインスタンス化した際に、インスタンスを参照するための変数の領域はスタックに確保され、インスタンス本体の領域はヒープ上に確保されます。

 スタックは「先入れ後出し方式」で、最初に入れたデータの上に新しいデータが次々に積み上げられていくようなイメージでデータが格納されます。で、あとに入れたデータ(つまり、一番上に積まれているデータ)から順に取り出していきます。ですので、関数内部の処理が進むにつれて次々にデータが積み上がり、さらに処理が進むと上からどんどんデータが取り出され、関数が終了すると空になるという仕組みです。このような処理はパソコンのCPUによって機械的に行われるので、データの読み書きが高速です。JavaScriptの変数も、もちろんスタックを利用します。

 一方、インスタンスが格納されるヒープ領域は、常に変数に格納されたアドレスを参照してアクセスすることになります。スタックのように関数の終了と共にデータが消えることはなく、インスタンスが使われる間は存在し続けます。しかし、使用することがなくなったインスタンスが残り続けるとメモリ領域が無駄に使われることになりますので、実行環境側で「もう使われることはない」と判断した場合は、これを自動で削除します。一部、プログラマー側でインスタンスを消去するためのコードを書かなければならない場合もありますが、大概は実行環境に組み込まれたプログラム(「ガベージコレクター」と呼ばれる)が処理してくれます。

 なお、JavaScriptには特に「ヒープ」という考え方はありませんし、ガベージコレクターなるものが存在するわけでもありません。しかし、表立って出てこないだけで、JavaScriptの参照型のデータは、ヒープと同等の仕組みを使っています。もちろん、使われなくなったインスタンスは、JavaScriptの実行エンジンが見付け出して、自動で消去するようになっています。

 あえてスタックとヒープの関係が出てこないのは、JavaScriptでは、直接、メモリを操作するような処理は行わないためです。ですので、JavaScriptにおいてスタックとヒープの関係が出てくることはありません。JavaScriptでは、「参照型のデータ(インスタンス)は専用の領域にあって、これを参照する変数を使ってアクセスする」と考えておけば十分だということですね。


使い倒すぞ! ビルトインオブジェクト

 さっそくビルトインオブジェクトを使っていくことにします。先にお話ししたように、ビルトインオブジェクトは実行環境に組み込まれていますので、オブジェクト名を指定して呼び出せば、すぐに使うことができます。

Point ビルトインオブジェクトに含まれるオブジェクト

 ECMAScriptにおいて、JavaScriptの標準仕様として規定されているビルトインオブジェクトには、次のものがあります。

オブジェクト 内容
String 文字列を扱うためのオブジェクト
Array 配列を扱うためのオブジェクト
Number 数値を扱うためのオブジェクト
Math 数学の関数計算を行うオブジェクト
Date 日付や時刻を扱うためのオブジェクト
RegExp 正規表現(文字列のパターンマッチ)を行うオブジェクト
Object すべてのオブジェクトの元になるオブジェクト。オブジェクトの共通の要素を定義している
Boolean 論理値(true/false)を扱うためのオブジェクト
Function 関数を扱うためのオブジェクト

 これらのオブジェクトを使うことで、文字列や数値の操作や日付の操作など、プログラムとしての基本的な大概の処理が行えます。


書籍紹介

JavaScript Web開発パーフェクトマスター

JavaScript Web開発パーフェクトマスター

金城俊哉著
秀和システム 3,672円

JavaScriptは、Webアプリ開発の定番言語です。本書は、JavaScriptの初学者向けにWebアプリ開発に必要なノウハウを、ボトムアップ方式で基礎から応用までやさしく解説します。

若手プログラマーが講師となって、JavaScript未体験のエンジニアに手ほどきをするというペアプロ形式で説明していくので、プログラミングスクールで1対1のレッスンを受けている感覚で読み進めていただけます。開発現場ですぐに役立つ技が満載です!

注文ページへ


前のページへ 1|2       

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。