首先這是完整的原型鏈圖(圖片來自百度,在這裏是引用他的圖片, 未曾謀面但是筆者向其表達敬意);
這一整張圖,我們只需要構造一個函數;
圖中已經構造好了一個函數 Person();
我們知道:
萬物皆對象:構造函數既是一個函數,同時也是個對象,原型同時也是一個對象
如果聲明瞭一個構造函數,系統內部就會幫我們自動的生成一個與之對應的原型對象
.prototype : 用於訪問原型對象
.__proto__ : 是屬於對象的,指向實例化這個對象的構造函數對應的原型
.constructor : 屬於原型的 , 指向這個原型對應的 構造函數
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
構造的函數 Person(); 系統會自動幫我們生成一個函數對象 Person.prototype原型
Person();可以用語法 Person.prototype 來訪問它的原型
而 Person.prototype.constructor 是用來指回他的構造函數 Person(); 的
在控制檯上打出來:
用圖表示是:
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
而 Person(); 實例化的對象 P1 可以用 .__proto__ 來指回到他的原型
在控制檯中打出來:
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
整個過程用圖表示就是這個樣子的
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
原型同是也是一個對象,
那麼Person.prototype 它對應的原型是什麼?
是 Object.prototype
Object.prototype是一個原型, 也是一個對象,
它對應的原型又是什麼?
是 null ;
null之後就沒有了;因爲null本身就是”無“的意思。
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
構造函數 Person(); 同時也是一個實例化的對象
那誰是它的原型呢?
這裏我們要知道一點: 函數是一個對象,這個對象是由 Function構造函數 實例化的
那麼
於是用 Function.prototype 指回 它的構造函數 也會有
但是 注意一點 Function 它也是一個構造函數
那就是說 Function 也會把它本身實例化 :
於是會有
整個的過程是
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
同時Function.prototype原型 也是一個對象
它也是和 Person.prototype 原型一樣 看做一個對象
那麼這個對象也會指向 Object.prototype 原型
而 Object.prototype 原型 同時也可以看做是一個對象 最終會指向null
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
既然Object.prototype是原型 也肯定有它對應的構造函數
我們用 .constructor 打印出來看看
那麼Object 也一定會有
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
於是 我們整個的原型鏈就完成了
用圖表示就是