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