所有東西都是物件或純值

前一堂課了解到 JavaScript 中的 Prototypal Chain 後,這堂課將進一步探討物件中的 prototype

JavaScript 中,所有物件都有 prototype,除了最基礎物件 base object

那到底什麼是 base object 呢 ?

首先,我們透過 console 來看到每一種物件的 prototype,分別是物件 object、函式 function 與陣列 array

1
2
3
var a = {};              // object
var b = function() {}; // function
var c = []; // array

透過 a.__proto__ 我們可以看到物件的 prototype 也是一個物件,打開它會發現已經有許多預設的 method,包含我們在開發時常用到的 toStringvalueOf 等等,從這裡就可以得知為什麼每當我們創造一個物件時就會有這些 method 可以使用,因為我們透過自己宣告的物件來使用這些 method 時,會發現自己身上找不到,便會透過 prototypal chain 的概念往 prototype 找到這個物件,所以我們宣告的物件就有這些 method 了。

接著來看到 function,我們一樣透過 b.__proto__ 來看 functionprototype,會得到一個空的函式,進一步在後方加上一個點 dot operator 查看它 method,會發現出現許多 method ,其中包含前幾堂課中學過的 callbindapply,同理這也就是我們在建立函式後會有這些 method 可以使用的原因了。

最後透過 c.__proto__ 看到 arrayprototype,同樣會有許多預設的 method 供我們使用。

那麼回到最一開始的問題,什麼是最基礎物件 base object 呢 ?

其實就是一般物件 (前面範例的 a) 的 prototype 了,前面提到,所有物件都有 prototype,除了這個 base object 除外,所以當我們不斷透過 .__proto__ 指向物件的 prototype 直到指向這個 base object,它就會出現 null ,包含函式 function 和陣列 arrayprototype 最後也會指向 base object,所以我們才會說所有物件除了 base object 都有 prototype

資料來源

Udemy-JavaScript: Understanding the Weird Parts`