prototype調査

JavaScriptのprototypeについて

プロトタイプベース

まず、JavaScriptオブジェクト指向は正確にはプロトタイプベースのオブジェクト指向というものらしい。
例によってWikiPediaに頼る。
http://ja.wikipedia.org/wiki/プロトタイプベース
2006年7月20日現在詳細な解説は掲載されていないので、他の参考文献。
http://codezine.jp/a/article.aspx?aid=222
あるいはWikiPediaオブジェクト指向に関する、インスタンスベースという項目の解説など。
http://ja.wikipedia.org/wiki/オブジェクト指向プログラミング


まず、そもそもプロトタイプとはなんぞやという事でWikiから一部引用。

情報工学においては、プロトタイプは関数・サブルーチンの宣言を指す(たとえば、C言語のプロトタイプ関数宣言など)。
しかし、たいていのオブジェクト指向プログラミング言語では、プロトタイプは「クローンとしての新しいオブジェクト」を作ることができるオブジェクトを指す。

全然解説になってないが、要するに「プロトタイプベースという新しい概念」と思った方がいいようだ。

より詳しい解説

Effective JavaScriptという素敵サイト。
http://www.interq.or.jp/student/exeal/dss/ejs/3/2.html
ほぼここの解説で全網羅されていると思われる。

実際に検証

http://tsuge.astgate.biz/proto/prototest.html
とりあえず簡単に。チェーンは確認出来る。eval形式になっているので適当にいじってみていただければわかりやすいと思われる。
例えばObject.prototypeをいじっている前後に下記ソースを代入すれば、

 for (var a in t) {
  addLog("t."+a+":"+eval("t."+a));
 }

eachが破壊される様子なども見て取れる。

まとめ

以下、要点を箇条書き。

  1. JavaScriptで言うクラスの単位はコンストラクタである
  2. new演算子で呼び出されるのはコンストラクタである
  3. コンストラクタは特殊なプロパティ「prototype」を保持している
  4. prototypeプロパティとコンストラクタは一対一の関係であり、一つのコンストラクタに二つのprototypeが存在することはない
  5. コンストラクタのメンバとインスタンス*1のメンバは別々に定義できる。逆にインスタンスからコンストラクタのメンバは参照できないし、コンストラクタからインスタンスのメンバは参照出来ない。

明日以降への持ち越し

まだ少し不明な点があるので、明日また少し調査するものとする。
以下、列挙。

  1. プロトタイプベースとprototypeプロパティの関係
  2. コンストラクタとクラスの関係
  3. クローンとインスタンスの相違点。クローン=インスタンスなのか、クローン=prototypeプロパティのチェーンを差しているのか?
  4. constructorプロパティとConstructの関係
  5. ECMAScriptJavaScriptの関係

はまりそう。
一日30分とかじゃなくて、2,3日まとめてやりたいところだが。

*1:そう呼ぶかは不明