
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()は以下のような順序で検索が行われます。
- s.hello
- Shiraishi.prototype.hello
- Person.prototype.hello (Shiraishi.prototypeは、Personクラスのオブジェクトだから)
- Object.prototype.hello (Person.prototypeはObjectクラスのオブジェクトだから)
そして、この例ではステップ3においてhello()が見つかります。「親クラスが持つメソッド・属性を引き継ぐ」と言う、継承の機能をきちんと実現できていますね。
folllow builer on
twitter
- 新着記事
- 特集
- ブログ
- 企画特集
-
漫画で解説!運用管理のコツ
-
次の一手はこれだ!
-
利便性とセキュリティの両立
-
モバイルデバイスもターゲットに!
-
いままさに社会にとっての転換点
-
企業DXのキモはクラウドにあり
-
話題のセキュリティ事故体験ゲーム
-
中小企業でのひとり情シスIT運用術
-
Kubernetesの認定制度が開始
-
連載!プロが語るストレージ戦略
-
DXができない企業が滅びる理由
-
連載!プロが語るストレージ戦略
-
内部不正や不注意をどう防ぐ?
-
講演の見どころを紹介
-
常識を疑え!
-
明日からではもう遅い?!
-
幸せ?不幸?ひとり情シス座談会
-
特集:IT最適化への道
-
ビッグデータ最前線!
-
連載!プロが語るストレージ戦略
-
ゼロトラストに不可欠なID管理
-
デジタルを当たり前と言えるか?
-
セキュリティの今を知る
-
さあ、クラウドで解決しよう。
-
現場主導の業務変革のポイント
サイトの内容を参考にして、楽しく開発を行っています。
最近、プロトタイプのオブジェクト指向がとても、危険な行為
に感じれれて来ています。理由は様々ですが、
しいて言えば、オブジェクトのメンバーに代入するコーディングが
危なっかしいことに、思えてきます。javascriptの仕様上、オブジェクトに
対してなんでもできる認識が不足している感じがします。
気をつければ良いと考えれば、それまでですが、本来は
それを気にしなくて良い、コーディングができることを最近
感じて来ています。javascriptが持つ言語仕様から考えて、代入をすることが
一番バグが発生していることを、技術者として良く感じます。
発見ができない状態もしばしば見受けられます。
親子継承関係をしないと、開発ができないと誰もが思って開発を行っている
こと自体が危ない感じはします。親子継承がメモリーを節約している考え自体おかしいです。
本来の継承概念が親子関係で成立していると思われていることがjavascriptでの開発を
危うくしていることに最近感じるようになってきました。私のアプローチの内容が
本来正しいかは疑問に思いますが。
javascriptを本来のコーディングで行うように、示してほしいです。
私の内容が亜流ととらえる周りのプログラマーは、
危険な行為だとの認識は少ないと思います。代入がすべてではありません。代入行為は
最小にすべきだと認識します。
代入でバグはでるが、そんなの当たり前程度だと認識しているプログラマーが多く見受けられます。それも著名なプログラマーが行っているからだと思われます。
始まりは、他の言語の転用しての開発が本来の言語の仕様を隠ぺいしてることが問題だと思います。さらにプロトタイプチェーンが問題がさらに拡大していることに最近感じるように思われます。
この問題をあなたは、どのようにとらえますか?