LoginSignup
9

More than 5 years have passed since last update.

posted at

updated at

porototypeの解釈が曖昧だったので

プロトタイプオブジェクトは関数オブジェクトが持つプロパティの一つ

var Klass = function(){ /*...*/ };
-> console.log Klass.prototype
-> [Object]

インスタンス生成時の __proto__ の動き

1.コンストラクタを作る

var Klass = function(){ /*...*/ };
  1. コンストラクタ生成
  2. Klass.prototypeにはconstructorプロパティと__proto__
  3. Klass.__proto__はただの空の関数 function Empty(){};

2.コンストラクタのprototypeに追加

var Klass = function(){ /*...*/ }
Klass.prototype.init = function(){ /*...*/ };
  1. Klass.prototypeにinitが足される

3.インスタンスを生成

var Klass = function(){ /*...*/ }
Klass.prototype.init = function(){ /*...*/ };
var mod = new Klass;
  1. modの__proto__にKlassのprototypeが代入される
  2. コンストラクタに初期値をセットしておくとインスタンスのプロパティとして使われる
  3. KlassにhasOwnPropertyでinit関数があるか調べるとfalseが返る
  4. modの__proto__にhasOwnPropertyでinit関数があるか調べるとtrueが返る

mod.initを実行した時、最初にmodのプロパティのinit関数を探す、
なかったらそのまま __proto__ 内のinit関数を探しにいく(コンストラクタのprototype)、そこになければさらに上の __proto__ を探しにいく。これがプロトタイプチェーン

proto について

__proto__ がプロトタイプチェーンを実現させている

__proto__ はすべてのオブジェクトにあるプロパティ

__proto__ とprototypeは別物

__proto__ へのアクセスは実装依存

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
9