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()は以下のような順序で検索が行われます。
- s.hello
- Shiraishi.prototype.hello
- Person.prototype.hello (Shiraishi.prototypeは、Personクラスのオブジェクトだから)
- Object.prototype.hello (Person.prototypeはObjectクラスのオブジェクトだから)
そして、この例ではステップ3においてhello()が見つかります。「親クラスが持つメソッド・属性を引き継ぐ」と言う、継承の機能をきちんと実現できていますね。
- 特集: JavaScriptのイロハ (16件)
- 今日のトップ記事
- 昨日
- 3日前
- 4日前
- 5日前
- 7日前
- ホワイトペーパー
- 話題のタグ
Database
CSS
まとめ
XHTML
Webデザイン
Leopard
Linux
RIA
MySQL
Adobe
HTML
Mozilla
PHP
Safari
Firefox 3
ライブラリ
Tips
Eclipse
server
Apache
開発環境
SOA
PostgreSQL
Firefox
ブラウザ
Off Topic
Java
iPod touch
iPhone
Ajax
Python
オープンソース
Windows
Mac OS X
Flash
リファレンス
入門
イロハ
仮想化
C/C++
Ruby on Rails
Webアプリケーション開発
小技
JavaScript
Internet Explorer
Microsoft
Ruby
Google
フレームワーク
Apple
話題のタグを見る »
仮想化Java環境のスループットを2倍に--BEA LiquidVMの適応型メモリ管理
Firefox 3が対応したdisplayプロパティの値(3) - inline-table
MSもアドビも学生さんに開発ソフトを無償提供
「Economist」のトップページがリニューアル
あなたがプログラムを理解できない10の理由:第2回
新APIまもなく登場--Google Developer Day 2008の見所とは?
内部統制対策を実現するIT運用管理ツール
-Simplify IT- ITをシンプルに 連載第2回
リスティング広告における競争優位性の維持