[TOC]
# 一图理解原型链
以下代码为例,看看用构造函数生成一个对象后,实例`f1`对象是如何与构造函数`Foo`、`Function`、`Object`串联起来的。
```js
function Foo() {}
const f1 = new Foo();
```
![](https://img.kancloud.cn/fe/30/fe30a5f49204beaa8efc206a1df8e4c2_800x419.png)
注意:`__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
- 框架篇
- 随记