🧬
プロトタイプチェーン — 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にメソッドを追加するパターン