自作コンパイラの部屋 > オブジェクト指向プログラム言語としてのJavaScript > 18.メソッドの継承

18.メソッドの継承

 前述のように、メソッドを定義するには、コンストラクタのprototypeプロパティに、関数オブジェクトのプロパティを追加すればよいことになります。従って、メソッドの継承とは、スーパークラス(継承元)のprototypeに定義されたメソッド(プロパティ)を引き継いで、継承先のクラスのprototypeプロパティに追加することにより実現できそうです。
 具体例により説明しましょう。前述のPointクラスを継承(拡張)して色のついた点(ColoredPoint)を定義してみます。
    function ColoredPoint(x, y, color) {   // ColoredPointのコンストラクタ
        this.x = x;
        this.y = y;
        this.color = color;    
    }
    new ColoredPoint(0, 0, "");   // ダミー

    // moveToメソッドは Point クラスから継承する
    ColoredPoint.prototype.moveTo = Point_moveTo;

    // toStringメソッドの定義
    function ColoredPoint_toString() {   // まず関数として定義して
        return "ColoredPoint(" + this.x + ", " + this.y + ", " + this.color + ")";
    }
    // メソッドの設定
    ColoredPoint.prototype.toString = ColoredPoint_toString;
    // 使用例
    var cp = new ColoredPoint(10, 30, "red");
    document.writeln("cp = ", cp);
    cp.moveTo(20, 40);
    document.writeln("cp = ", cp);

実行結果:

 上図の例では、moveToがPointクラスから継承されていることになります。
 このような手法により、継承が一応できたことになりますが、継承するメソッドを明示的に設定する必要があるため、スーパークラスの機能が「自動的に」継承されるわけではありません。これでは、単に面倒くさいという以上に、色々と不都合があります。
 その典型的なケースは、スーパークラスにメソッドを追加した場合です。他のオブジェクト指向言語では、コンパイルし直しさえすれば、サブクラスにも同じメソッドが追加されます。しかし、上記の手法だとサブクラスには明示的に設定しない限り、そのメソッドは追加されません。これだと追加し忘れがおきる危険性があります。
 自動的な継承については次節で検討することにしましょう。

19.メソッドの自動継承(1)

目次