開眼!JavaScriptの2.5のまとめです。
##2.5 プロパティへの参照はどのように解決されるのか
オブジェクト内に存在しないプロパティにアクセスしようとする場合、JavaScriptではそのオブジェクトのコンストラクタ関数のprototypeオブジェクトを参照して(遡っていって)探し当てようとする。
配列オブジェクトを作成して、定義されていないtoLocaleString()にアクセスすると、定義されていないにも関わらず結果が返されます。
var myArray= ['foo', 'bar'];
console.log(myArray.toLocaleString());
結果
foo,bar
ここでの動作としては、myArrayにtoLocaleString()プロパティがあるかを探しに行きますが無いため、そのオブジェクトのコンストラクタ関数(ここではArray())のprototypeオブジェクトを参照しています。
//myArrayのコンストラクタ関数はArray()
console.log(myArray instanceof Array); →true
しかしArray()にもtoLocaleString()は無いため、さらにそのコンストラクタ関数のprototypeオブジェクトを参照しにいきます。
Array.prototypeのコンストラクタ関数はObject()なのでObject.prototypeを参照しに行きます。ここでtoLocaleStringが見つかったためメソッドが実行され、結果が返されました。
もしObject.prototypeにもなければundefinedを返します。
var myArray= ['foo', 'bar'];
console.log(myArray.hoge);
結果
undefined