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

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

クラスの継承についての注意

 前ページで、プロトタイプチェインを用いれば「擬似的な」クラス継承を実現できると述べました。

 「擬似的な」とあえて付けているのには、実は訳があります。継承を本格的に実装しようとすると、以下のようなことを考慮しなくてはなりません。

  • サブクラスのインスタンス化に先立って、親クラスのコンストラクタが呼び出される
  • サブクラスから、親クラスのメソッド呼び出しを行う
  • 多重継承・単一継承の選択と仕組み作り

 はっきり言って、JavaScriptでこれら全てを考慮した仕組みを作るのは、難しいことではありませんが、かなり骨の折れる作業です。それに、「親クラスのメンバをサブクラスが受け継ぐ」と言うだけであれば、前述した方法以外にも道があります(親クラスのプロトタイプが持つプロパティを全てコピーする、など)。

 なので、本格的な継承を実現する仕組みについては、本連載「JavaScriptのイロハ」の後半で行う「Dojo Toolkitのソース読解」において、Dojoが実現しているクラス継承の仕組みを参考にしながら解説していく予定です。

まとめ

 プロトタイプチェインが理解できれば、JavaScriptオブジェクトは全てObject.prototypeを基点とした階層構造になっていることがお解りかと思います。

 これにより、JavaScriptは*「プロトタイプベースのオブジェクト指向言語である」 *と言われることがよくあります(対してJavaなどは「クラスベース」であると言われます)。解ってしまえば単純な仕組みなので、この機会にしっかり理解して、この先のJavaScriptライフに役立ててください!

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