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

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

Objectクラスは、全てのクラスの親となる

 ここまで来れば、オブジェクトのメンバ参照は、プロトタイプチェインの途中でメンバが見つからない場合、最終的には全てObject.prototypeを参照する、というのがお解りでしょう。プロトタイプチェインの終端は常にObject.prototypeなのですから。

 そう考えると、「あらゆるJavaScriptオブジェクトは、Object.prototypeが持つプロパティを呼び出し可能」ということになります。これはさらにいえば、「Objectクラスは、あらゆるJavaScriptクラスの親である」と言い換えても良いと思います。

 このことから言えるのは次の二つです。

Objectクラスが持つメンバは、あらゆるオブジェクトから利用できる

 あらゆるオブジェクトがObject.prototypeを継承しているのですから、これは当然です。

 JavaScript(ECMAScript)では、Objectクラスは以下のようなメンバを持つと規定されています。

  • constructor・・・オブジェクトの生成元になったコンストラクタ関数
  • toString()・・・オブジェクトの文字列表現を返す
  • toLocaleString()・・・オブジェクトの(ロケールに対応した)文字列表現を返す
  • valueOf()・・・オブジェクトを変換した値を返す。例えばNumberクラスは数値、Booleanクラスは真偽値を返す。デフォルトではオブジェクト自身(this)が返る
  • hasOwnProperty(propName)・・・指定されたメンバを、オブジェクト自身が持っているかどうかを真偽値で返す。プロトタイプチェインは辿らない
  • isPrototypeOf(value)・・・このメソッドを呼び出したオブジェクトが、valueのプロトタイプチェインに含まれているかどうかを返す。
  • propertyIsEnumerable(propName)・・・指定されたメンバを、オブジェクト自身が列挙可能(for..inで取得できる)かどうかを真偽値で返す。プロトタイプチェインは辿らない

 あまり馴染みのないメソッドも多いかと思いますが、とりあえずこれらのメソッドはあらゆるオブジェクトに対して呼び出し可能です。是非試してみてください。

Object.prototypeにあとから追加したメンバも、あらゆるオブジェクトから利用できる

 JavaScriptはきわめて動的な言語なので、あらゆるオブジェクトに対してメンバを後から追加したり、削除したりすることが自由に行えます。そのため、例えばObject.prototypeに対して後からメンバを追加したりすると、あらゆるオブジェクトから即座にそのメンバに対してアクセスを行えるようになります。

// あらゆるJavaScriptオブジェクトがhello()を持つようになる
Object.prototype.hello = function() {
  alert("Hello");
};
// Stringクラスも、hello()を持つようになる
"abc".hello();

 ただしこれは、プログラムに対する影響が非常に広いので、あまりおすすめはできません。

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