開眼! JavaScript――言語仕様から学ぶJavaScriptの本質を輪読会で読み進めている最中です。
本書の中で紹介されていたプロトタイプチェーンを辿って目的のプロパティを探している部分をChromeのデベロッパーツールを利用して、復習のため確認した📝になります。
JavaScriptでプロパティを呼び出す場合、JavaScript側では、呼び出されたプロパティが自身のプロパティに存在しない場合は、プロトタイプチェーンを辿ってプロパティが存在しないか確認して、存在する場合は存在したプロパティを呼び出す。プロトタイプチェーンを最後まで辿っても目的のプロパティが存在しない場合は、undefined
を返す。
本書に沿って、配列型の変数を宣言する。
var myArray2 = ['foo', 'test'];
join
メソッドを利用する
console.log(myArray2.join());
join
メソッドがあるかどうかhasOwnProperty
とin句
を利用して確認する。
myArray2.hasOwnProperty('join');
'join' in myArray2;
hasOwnProperty
の場合はfalse
で、in句
の場合はtrue
hasOwnProperty
は純粋に自身のプロパティにいるかどうかを確認して、
in句
の場合は、プロトタイプチェーンまで遡って存在確認した結果を返している。
⇒つまりプロトタイプチェーンのどこかのプロパティにjoin
は存在するが、自身はjoin
プロパティを保持していないことを指す。
プロトタイプチェーンを辿る
myArray2.__proto__
myArray2.__proto__.constructor
__proto__
はインスタンスを生成したコンストラクタ関数のprototypeプロパティにリンクする秘密のプロパティ。
myArray2
の場合は、Array()
でインスタンス化されているため、Array()
のprototypeオブジェクトを指す。
myArray2.__proto__.__proto__
↑の場合はさらにプロトタイプチェーンを遡ってObject()
のプロトタイプチェーン。JavaScriptは全てObject()
に通ず…的な感じ。
myArray2
→ Array()
→ Object()
プロトタイプチェーンからjoinメソッドを探す
myArray2.__proto__.hasOwnProperty('join');
⇒プロトタイプチェーンのプロパティにjoin
が存在することが確認できるため、ここまで遡って指定したプロパティに紐づくメソッドが実行されていた。
そのあと本書で紹介されいているtoLocaleString
は、Array()
にもObject()
のプロパティにも存在していて、この場合Array()
でプロトタイプチェーンの検索は終了なのかな…。
インスタンスに同名のメソッドが存在する場合
Object().toLocaleString()
Array().toLocaleString()
理解しないまま使っていたことだらけで、とても勉強になっています。
このまま継続して輪読会を実施していきます…。