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