JavaScriptのプロトタイプチェーンについて調べていたら、頭が爆発しそうになったので、理解できたところをまとめておきます。
1. オブジェクトにプロパティが存在する時は、それを返す。
2. オブジェクトにプロパティが存在しないときは、オブジェクトの__proto__プロパティをたどる。
__proto__プロパティは、オブジェクトのコンストラクタ関数のprototypeにリンクしている。
すなわち、
オブジェクト.__proto__ === オブジェクト.constructor.prototype ⇒ true
3. コンストラクタ関数のprototypeにプロパティが存在するときは、それを返す。
4. コンストラクタ関数のprototypeにプロパティが存在しないときは、prototypeのコンストラクタ関数、すなわちObjectのprototypeを調べる。
5. Object.prototypeにプロパティが存在するときは、それを返す。
6. Object.prototypeにプロパティが存在しないときは、undefinedを返す。