[TOC]
# 一圖理解原型鏈
以下代碼為例,看看用構造函數生成一個對象后,實例`f1`對象是如何與構造函數`Foo`、`Function`、`Object`串聯起來的。
```js
function Foo() {}
const f1 = new Foo();
```

注意:`__proto__`不是 JS 標準規范,`__proto__`是實例的屬性(也就是我們所說的按原型查找),`prototype`是構造函數的屬性,`constructor`是原型上的屬性。
* `f1`對象是構造函數`Foo`的實例,所以`f1`有`__proto__`屬性。
`f1.__proto__ === Foo.prototype`
`f1.__proto__.constructor === Foo.prototype.constructor === Foo`
* `Foo`和`Object`雖然是構造函數,但都是`Function`構造函數的實例,所以`Foo`、`Object`有`__proto__`屬性。
`Foo.__proto__ === Object.__proto__ === Function.prototype`
`Foo.__proto__.constructor === Object.__proto__.constructor === Function.prototype.constructor === Function`
* `Foo.prototype`和`Function.prototype`對象是構造函數`Object`的實例,所以都有`__proto__`屬性。
`Foo.prototype.__proto__ === Function.prototype.__proto__ === Object.prototype`
`Foo.prototype.__proto__.constructor === Function.prototype.__proto__.constructor === Object.prototype.constructor === Object`
# 特殊機制
* 特殊 1:`Object.prototype`按道理也是某構造函數的實例對象,應該是底層實現。
`Object.prototype` 是對象,但它不是通過 Object 函數創建的。`Object.prototype` 誰創建的,它是 v8 引擎(假設用的都是 chrome 瀏覽器)按照 ECMAScript 規范創造的一個對象。
`Object.prototype.__proto__ === null`鏈路到此結束
* 特殊 2:`Function`按道理也是某構造函數(指回了自己)的實例對象,應該是底層實現。
`Function.__proto__ === Function.prototype === Object.__proto__`
`Function.__proto__.constructor === Function.prototype.constructor === Function`實現閉合。
# 結論
1. 先有 `Object.prototype`(原型鏈頂端),`Function.prototype` 繼承 `Object.prototype` 而產生,最后,`Function` 和 `Object` 和其它構造函數繼承 `Function.prototype` 而產生。
2. `Function.__proto__ === Function.prototype`導致`Function.constructor === Function`,即:**Function 是它自己的構造函數**
引用自[http://www.mollypages.org/tutorials/js.mp](http://www.mollypages.org/tutorials/js.mp)
> https://github.com/jawil/blog/issues/13
> [原文鏈接](https://hub.fastgit.org/Godiswill/blog/issues/10)
> https://hub.fastgit.org/Godiswill/blog
- 修仙之路
- 基礎原理篇
- JS和Node.js事件環機制剖析
- 一圖理解原型鏈
- 手寫篇
- 基礎手寫
- 手寫實現 Promise A+ 類庫
- 手寫 CommonJS
- 手寫 Express 框架
- 手寫 React Router 4.0
- 手寫虛擬 DOM 和 DOM-Diff
- 手寫 Webpack 實現
- 手寫一個 MVVM 類庫
- 手寫一個 Vue-cli 腳手架
- 手寫 JWT 類庫
- 手寫 Mobx 類庫
- 手寫前端性能和錯誤監控框架
- 手寫 Vue 路由
- 手寫 Vuex 實現
- 手寫 redux 狀態容器
- 手寫 throttle 和 debounce
- Node 高級
- Mongodb
- 安全測試篇
- CSRF原理實現
- XSS原理實現
- 九種跨域方法全解析
- 編寫單元測試
- 爬蟲篇
- 使用puppeteer破解滑動驗證碼
- 工程篇
- 使用AST語法樹手工轉譯ES6代碼
- 編寫自己的webpack插件
- 實戰篇
- webpack4.0 實戰
- Canvas+Websocket 實現彈幕
- canvas 動效
- SVG 動效
- CSS3 實現 Apple Watch 中的呼吸燈效果
- CSS3 實現動態氣泡屏保效果
- 算法篇
- 基礎知識
- 服務器端
- 分布式架構中的冪等性
- TCP/UDP
- Docker
- V8
- 動畫篇
- 貝塞爾曲線
- requestAnimationFrame
- 框架篇
- 隨記