TOPシステム開発> クラスの継承
まるごとJavaScript&Ajax!
JavaScriptを洗練させるPrototype.js

第3回:Prototype.js流のオブジェクト指向を理解する
著者:ガイアックス  天野 仁史   2007/2/28
前のページ  1  2
クラスの継承

   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の応用

   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: ' おはよう' });// 天野さんおはようと表示する

   更に、アイデア次第でさまざまな使い方ができると思います。


次回は

   次回は「関数の拡張」について解説していきます。

前のページ  1  2

株式会社ガイアックス 天野 仁史
著者プロフィール
株式会社ガイアックス   天野 仁史
渋谷で働くWebプログラマ。出身は石川県金沢市。21歳でプログラミングに出会い、IT戦士になることを決意。それからというもの、寝ても覚めてもプログラムを書き続け今に至る。はてなでamachangというidでブログを書いてます。

IT戦記
http://d.hatena.ne.jp/amachang/


INDEX
第3回:Prototype.js流のオブジェクト指向を理解する
  Prototype.jsを使ってみよう
クラスの継承