自作コンパイラの部屋 > オブジェクト指向プログラム言語としてのJavaScript > 14.コンストラクタとメソッド
一般的に(つまりJavaScriptに限らず色々な言語では)クラスはプロパティ(メンバー変数)とメソッド(メンバー関数)を持つことになっています。これらのうちプロパティについては、前節で説明したとおりです。つまり
JavaScript
はオブジェクトのプロパティをサポートします。
前に述べたように、JavaScriptは関数もオブジェクトの一種であり、オブジェクト同様変数に代入することができます。この性質を利用して、JavaScriptのメソッドを定義することができます。
メソッドの実例として、Pointクラスのメソッド
moveTo(x, y) と toString() という二つのメソッドを追加してみます。それぞれ、「点」を移動するメソッド、Pointクラスのオブジェクト(インスタンス)を表示用に文字列変換するメソッドです。
// moveTo を関数として定義。名前は何でも良いが、
// Point_をつけておくと分かりやすい
function Point_moveTo(x, y) {
this.x = x; // プロパティ x を変更
this.y = y; // プロパティ y を変更
return this; // 自分自身を返すようにすると便利
}
function Point_toString() { // toString を関数として定義
return "Point(" + this.x + ", " + this.y + ")";
}
function Point(x, y) {
this.x = x;
this.y = y;
this.moveTo = Point_moveTo; // メソッド moveTo を設定
this.toString = Point_toString; // メソッド toString を設定
}
var p = new Point(10, 20); // Pointオブジェクトを生成
document.writeln("p = ", p); // 表示。toStringメソッドが暗黙に呼ばれる
p.moveTo(30, 100); // 移動。moveToメソッドの明示的な呼び出し
document.writeln("p = ", p);
実行結果:
上図のように、メソッドを定義するためには、
という二段階を踏むことになります。
これで絶対に悪いという訳ではないのですが、オブジェクト(インスタンス)ごとにメソッドのポインタを持つのは、メモリ効率が悪いと思われるかもしれません。
ことに、メソッドの種類とインスタンスの数が多い場合には、メモリが余計に必要です。
この問題を克服するために、JavaScriptでは
prototype という特別なプロパティを用います。
| 目次 |