##プロトタイプオブジェクトは関数オブジェクトが持つプロパティの一つ
var Klass = function(){ /*...*/ };
-> console.log Klass.prototype
-> [Object]
##インスタンス生成時の __proto__
の動き
###1.コンストラクタを作る
var Klass = function(){ /*...*/ };
- コンストラクタ生成
- Klass.prototypeにはconstructorプロパティと
__proto__
- Klass.
__proto__
はただの空の関数 function Empty(){};
###2.コンストラクタのprototypeに追加
var Klass = function(){ /*...*/ }
Klass.prototype.init = function(){ /*...*/ };
- Klass.prototypeにinitが足される
###3.インスタンスを生成
var Klass = function(){ /*...*/ }
Klass.prototype.init = function(){ /*...*/ };
var mod = new Klass;
- modの
__proto__
にKlassのprototypeが代入される - コンストラクタに初期値をセットしておくとインスタンスのプロパティとして使われる
- KlassにhasOwnPropertyでinit関数があるか調べるとfalseが返る
- modの
__proto__
にhasOwnPropertyでinit関数があるか調べるとtrueが返る
mod.initを実行した時、最初にmodのプロパティのinit関数を探す、
なかったらそのまま __proto__
内のinit関数を探しにいく(コンストラクタのprototype)、そこになければさらに上の __proto__
を探しにいく。これがプロトタイプチェーン
proto について
__proto__
がプロトタイプチェーンを実現させている
__proto__
はすべてのオブジェクトにあるプロパティ
__proto__
とprototypeは別物
__proto__
へのアクセスは実装依存