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

白石俊平(あゆた)
2008-03-21 19:00:00
  • このエントリーをはてなブックマークに追加

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

 前回は、「プロトタイプチェインとは何か」について詳しくお話ししました。オブジェクトのメンバを検索するにあたって、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()が見つかります。「親クラスが持つメソッド・属性を引き継ぐ」と言う、継承の機能をきちんと実現できていますね。

  • コメント(1件)
#1 anonymous   2010-10-14 07:27:32
いつも拝見させて頂いています。
サイトの内容を参考にして、楽しく開発を行っています。
最近、プロトタイプのオブジェクト指向がとても、危険な行為
に感じれれて来ています。理由は様々ですが、
しいて言えば、オブジェクトのメンバーに代入するコーディングが
危なっかしいことに、思えてきます。javascriptの仕様上、オブジェクトに
対してなんでもできる認識が不足している感じがします。
気をつければ良いと考えれば、それまでですが、本来は
それを気にしなくて良い、コーディングができることを最近
感じて来ています。javascriptが持つ言語仕様から考えて、代入をすることが
一番バグが発生していることを、技術者として良く感じます。
発見ができない状態もしばしば見受けられます。
親子継承関係をしないと、開発ができないと誰もが思って開発を行っている
こと自体が危ない感じはします。親子継承がメモリーを節約している考え自体おかしいです。
本来の継承概念が親子関係で成立していると思われていることがjavascriptでの開発を
危うくしていることに最近感じるようになってきました。私のアプローチの内容が
本来正しいかは疑問に思いますが。
javascriptを本来のコーディングで行うように、示してほしいです。
私の内容が亜流ととらえる周りのプログラマーは、
危険な行為だとの認識は少ないと思います。代入がすべてではありません。代入行為は
最小にすべきだと認識します。
代入でバグはでるが、そんなの当たり前程度だと認識しているプログラマーが多く見受けられます。それも著名なプログラマーが行っているからだと思われます。
始まりは、他の言語の転用しての開発が本来の言語の仕様を隠ぺいしてることが問題だと思います。さらにプロトタイプチェーンが問題がさらに拡大していることに最近感じるように思われます。
この問題をあなたは、どのようにとらえますか?
  • 新着記事
  • 特集
  • ブログ
このサイトでは、利用状況の把握や広告配信などのために、Cookieなどを使用してアクセスデータを取得・利用しています。 これ以降ページを遷移した場合、Cookieなどの設定や使用に同意したことになります。
Cookieなどの設定や使用の詳細、オプトアウトについては詳細をご覧ください。
[ 閉じる ]