今更ながら、Prototype.js でクラスの継承とオーバーライドをやってみた記録。
しばらく使ってなかったら、$super()
という便利なものができていた。
コード例
// 基底クラス
var Parent = Class.create({
// コンストラクタ
initialize: function() {
// <p> 要素を生成して <body> に挿入
this.ele = new Element('p');
$$('body')[0].insert(this.ele);
}
// “word”を画面に表示
,say: function(word) {
this.ele.update(word);
}
});
// Parent を継承したクラス
var Child = Class.create(Parent, {
// コンストラクタ
initialize: function($super) {
// Parent のコンストラクタを実行
$super();
}
// Parent の say() をオーバーライドする
,say: function($super, word, word2) {
$super(word);
// “word, word2”という文字列を画面に表示
this.ele.update(this.ele.innerHTML + ', ' + word2);
}
});
var c = new Child;
c.say('One', 'Two');
// -> 画面上に 'One, Two' と表示される。
メソッドを定義するとき第一引数に $super
を与えると、親クラスの同名のメソッドへの参照が与えられる。これを使ってメソッドのオーバーライドが簡単にできるのだ。
第二引数以降は親クラスから順に与えられる。これを使って引数の数すら変えることができる。上の例で言えば、Parent
クラスの say()
メソッドは引数を一つ採るが、Child
クラスの say()
メソッドは二つ採る。