自作コンパイラの部屋 > オブジェクト指向プログラム言語としてのJavaScript > 20.メソッドの自動継承(2)
前節では、メソッドの自動継承の手法としてprototypeプロパティをそのままコピーする方法を検討しましたが、これではうまくいかないことを確認しました。
次なる方法は、スーパークラスのprototypeプロパティの内容を、一項目ずつサブクラスのprototypeにコピー(代入)するという方法です。
この方法の実現にはJavaScriptのfor/inを使用するのが便利です(下記)。
for (var prop in Point.prototype) {
ColoredPoint.prototype[prop] = Point.prototype[prop];
}
上記プログラム断片は非常に一般的な内容なので、汎用部品として関数にした方が良いでしょう。
function inherit(subClass, superClass) {
for (var prop in superClass.prototype) {
subClass.prototype[prop] = superClass.prototype[prop];
}
}
これにより、ColoredPointクラスを実現した例を以下に示します。
function ColoredPoint(x, y, color) { // ColoredPointのコンストラクタ
this.x = x;
this.y = y;
this.color = color;
}
new ColoredPoint(0, 0, ""); // ダミー
inherit(ColoredPoint, Point); // Colorクラスの自動継承
// 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);
実行結果:
| 目次 |