Prototype.jsではObject.extendメソッドを使うことによって、クラスの「継承」を行うことができます。Object.extendメソッドの役割は、オブジェクトのマージです。第1引数に渡されたオブジェクトに第2引数に渡されたオブジェクトのプロパティをすべてコピーするのです。では、これを使ってどのように継承を行うのでしょうか。
リスト10の例を見てください。
リスト10:クラスの継承
// Humanクラスを継承したProgrammerクラスを定義する
var Programmer = Class.create();
Object.extend(Programmer.prototype, Human.prototype);
Object.extend(Programmer.prototype, {
// オーバライド
initalize: function(name, language) {
this.name = name;
this.language = language;
},
// メソッドの追加
program: function() {
alert('writing ' + this.language + '...');
}
});
継承を行うには、以下の2ステップが必要になります。
まず、子プロトタイプ(子クラスのプロトタイプ)と親プロトタイプ(親クラスのプロトタイプ)をマージします。これによって、親プロトタイプのすべてのプロパティが子プロトタイプにコピーされます。
次に、新しく追加するプロパティやオーバライドするプロパティを子プロトタイプにマージします。これによって、親プロトタイプを拡張した子プロトタイプを作ることができます。
Prototype.jsでは、このように比較的簡単に継承を行うことができるのです。また、継承とはいえObject.extendを使ってプロバティをマージしているだけですので、単なるオブジェクトから継承を行うなどという荒技もできます。
|
Object.extendメソッドの代表的な使われ方は継承ですが、それ以外に使うこともできます。例えば、リスト11のようにデフォルト値に引数をマージすることで柔軟な引数を持つ関数を作ることもできます。
リスト11:デフォルト値と引数をマージ
function message(opts) {
opts = Object.extend({
name: '名無し',
message: 'こんにちは!'
}, opts || {});
alert(opts.name + ' さん' + opts.message);
}
message(); // 名無しさんこんにちは!と表示する
message({ name: ' 天野' }); // 天野さんこんにちは!と表示する
message({ message: ' こんばんは' }); // 名無しさんこんばんはと表示する
message({ name: ' 天野', message: ' おはよう' });// 天野さんおはようと表示する
更に、アイデア次第でさまざまな使い方ができると思います。
|