自作コンパイラの部屋 > オブジェクト指向プログラム言語としてのJavaScript > 16.prototypeによるメソッド定義

16.prototypeによるメソッド定義

 まず、prototypeプロパティを利用して、Point.moveToメソッドとPoint.toStringを定義する方法を紹介しましょう。

    // 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;
    }
    new Point(0, 0);                  // ダミー
    Point.prototype.moveTo = Point_moveTo;       // moveToメソッドの設定
    Point.prototype.toString = Point_toString;   // toStringメソッドの設定

 prototypeプロパティの使用例は、最後の二行をご覧ください。
 これにより、メソッドを利用するインスタンスを生成するたびに、コンストラクタ内でで一々メソッドを設定する必要はなくなります。また、//ダミーとマークした行で、Pointのコンストラクタを起動して、ダミーのオブジェクトを生成しています。これは、Netscape Navigator Ver2, Ver3のバグへの対処です。これがないと、クラス(コンストラクタ)のprototypeプロパティが生成されません。
 以上で、JavaScriptによりクラスの定義、メソッドの実装が行えることが分かりました。ここでもう一つ、クラスの継承ができれば、JavaScriptがほぼ完全なオブジェクト指向言語と言えることになります。JavaScriptは言語自体に「継承」とうたっている機能はありませんが、今までに説明した機能の組み合わせにより、継承の仕組みを実現することができます。  

17.継承の考え方

目次