大事な点
- プロトタイプ言語ではクラス→インスタンスの関係はない
- すべてがオブジェクトみたいなもの(プリミティブ型を除く)
- オブジェクトが親オブジェクト的なものをプロトタイプという概念で保持
- 自分にメッセージの応答(プロパティやメソッドの定義)がなければ、自分が保持するプロトタイプに同様のメッセージを転送する。
つまりこんな感じ。
Main.js
// 適当なオブジェクトを3つ作成
var a = new Object;
var b = new Object;
var c = new Object;
// aにメッセージ応答を定義
a.hoge = "hoge";
// bとcにプロトタイプをセット
b.__proto__ = a;
c.__proto__ = a;
// メッセージ送信
console.log(a.hoge); // "hoge" // 当然a.hogeが呼び出される
console.log(b.hoge); // "hoge" // b.__proto__.hogeに転送
console.log(c.hoge); // "hoge" // c.__proto__.hogeに転送
結論
- JavaScriptに代表されるプロトタイプ言語にはクラス→インスタンスという概念は無い
- クラス→インスタンス的な概念は、共通処理を実装したオブジェクトを、各オブジェクトのプロトタイプにセット(共有)して利用する
- new Object的なものは結局指定された定数をプロトタイプにセットしたオブジェクトを返すだけ(その後コンストラクタも呼び出すけど)
参考
- IO言語とか調べるとわかりやすい、スロットの概念とか
- 7つの言語 7つの世界 Bruce A. Tate http://www.amazon.co.jp/dp/4274068579