JavaScriptがプロトタイプベースのオブジェクト指向言語ってどういうこと?

白石俊平
2008/03/21 19:00

今回はプロトタイプチェインの重要性を説明したいと思います。そのために、まずプロトタイプチェインを用いて擬似的なクラスの継承を行い、その上でObjectクラスが持つメンバについてもお話ししておきたいと思います。

前回までのおさらいと今回のあらすじ

 前回は、「プロトタイプチェインとは何か」について詳しくお話ししました。オブジェクトのメンバを検索するにあたって、JavaScriptランタイムがプロトタイプチェインを順々に検索していくと言う動作についてのお話でした。

 今回は、きわめて単純に見えるこの仕組みが、JavaScriptにとっていかに重要であるかを説明したいと思います。そのために、まずプロトタイプチェインを用いて擬似的なクラスの継承を行い、その上でObjectクラスが持つメンバについてもお話ししておきたいと思います。

プロトタイプチェインを使った擬似的な継承

 前回お話ししたプロトタイプチェインについては、しっかり理解していただけましたでしょうか。この一見単純な仕組みを応用すると、JavaScriptにおいても、擬似的なクラス継承を実現することができます。

 例えばPersonクラスを継承したShiraishiクラスを作るとしましょう。すると、以下のようにすればPersonクラスが持つメンバを全て継承できるのです。

// Personクラス。メソッドhello()を持つ
function Person() {
}
Person.prototype.hello = function() {
  alert("Hello");
};

// ShiraishiはPersonクラスを継承して作りたい
function Shiraishi() {
}
// プロトタイプにPersonのインスタンスを代入する!
Shiraishi.prototype = new Person();

var s =new Shiraishi();
// 継承したメソッドの呼び出し
s.hello();

 「継承」と言うからには、サブクラス「Shiraishi」は親クラス「Person」のメソッドを持っているはず。そういう点から見て、最後の「s.hello()」という呼び出しがきちんと成功するはずです。

 hello()は以下のような順序で検索が行われます。

  1. s.hello
  2. Shiraishi.prototype.hello
  3. Person.prototype.hello (Shiraishi.prototypeは、Personクラスのオブジェクトだから)
  4. Object.prototype.hello (Person.prototypeはObjectクラスのオブジェクトだから)

 そして、この例ではステップ3においてhello()が見つかります。「親クラスが持つメソッド・属性を引き継ぐ」と言う、継承の機能をきちんと実現できていますね。

記事の感想やご意見をコメントでお寄せください(CNET_IDログインが必要です)
ログイン パスワードを忘れた方  |  新規登録
  • 新着記事
  • 人気記事
  • 特集
  • ブログ