プロトタイプオブジェクトは関数オブジェクトが持つプロパティの一つ
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__ へのアクセスは実装依存