🧬

プロトタイプチェーン — classがなかった時代の継承

__proto__、prototype、Object.create()の関係

proto vs prototype

__proto__ — 全オブジェクトが持つ内部リンク。「親」を指す。(正式名:[[Prototype]]

prototype関数だけが持つ属性。new Foo()で生成されたオブジェクトの__proto__Foo.prototypeを指す。

classはシンタクティックシュガー

classを使ってもfunctionを使ってもプロトタイプチェーンは同じ。classは既存のプロトタイプチェーンを読みやすく包んだもの。

プロパティ検索順序

obj.prop:obj自体→obj.proto→...→null。nullに到達するとundefined返却。

キーポイント

1

全オブジェクトは__proto__(=[[Prototype]])で親オブジェクトを参照

2

new Foo()で作ったオブジェクトの__proto__はFoo.prototypeを指す

3

プロパティ検索:自分自身→__proto__→__proto__.__proto__→null

4

classはprototypeベース継承のシンタクティックシュガー — 内部動作同一

ユースケース

ライブラリコード読解 — prototype操作を理解しないと読めない ポリフィル実装 — Array.prototypeにメソッドを追加するパターン