PR

prototypeを利用してメソッドを追加

 リスト21では、プロパティとメソッドが本質的には同じものであることを示すために、コンストラクタの中でプロパティとメソッドをまとめて定義しました。しかし、実はこれはあまり良い方法ではありません。

 なぜなら、コンストラクタ関数で定義されたメソッドは、インスタンスにすべてコピーされるからです(図3上)。一般的にメソッドは、どのインスタンスのものであるかにかかわらず、処理の内容は同じはずです。同じものをいちいちコピーして別々のメモリー領域を消費するのは無駄です。

図3●プロトタイプを利用するメリット
図3●プロトタイプを利用するメリット
[画像のクリックで拡大表示]

 そこでJavaScriptでは、オブジェクトにメソッドを追加するための仕組みとして、prototypeというプロパティを用意しています。prototypeプロパティは最初、空のオブジェクトを参照しています。このオブジェクトをプロトタイプと呼びます。プロトタイプには自由にメソッドを追加できます。

 プロトタイプで定義されたメソッドは、インスタンス化されたオブジェクトから暗黙的に参照されます。プロトタイプに追加されたメソッドは、あたかもインスタンスのメンバーのようにアクセスできます(図3下)。実際にはインスタンスが持っているのは参照なので、無駄なメモリーの消費を防げます。また、プロトタイプの内容を変更すると、それを参照しているインスタンスでも変更が即座に反映されます。

 具体的なコードも見てみましょう。リスト24は、リスト21のtoStringメソッドをプロトタイプで定義するように書き換えたものです。BookのprototypeプロパティにtoStringメソッドを追加しています(1)。生成したインスタンスでもtoStringメソッドが動作することを確認できます(2)。

リスト24●プロトタイプを利用してメソッドを定義するようリスト21を書き換える
リスト24●プロトタイプを利用してメソッドを定義するようリスト21を書き換える
[画像のクリックで拡大表示]

 プロトタイプにはメソッド以外のプロパティを定義することも可能です。しかし、このようなことは実用的にはあまり意味がありません。