原型以及原型链
1. 原型
- 每个函数都有一个显式原型属性prototype
- 每个实例都有一个隐式原型属性__proto__
- 实例的__proto__和对应函数的prototype都指向原型对象
- 原型对象有个constructor属性指向其构造函数
2. 原型链
- 从对象的__proto__开始,连接的所有对象,就是原型链,也叫隐式原型链
- 查找对象属性,先找自身,找不到就沿着原型链找,找不到就返回undefined

3. 终极原型链
- 万物皆对象(除基本类型)
- 所有对象都是Object的实例(直接或间接)
- 所有函数都是Function的实例(包括Function)
- 函数是特殊的对象

- Function是一个特殊的对象,他可以扩展属性,包含对象的特性,所以可以推出Function的原型对象上的__proto__隐式原型指向Object的原型对象
- Function生出了Object,并且Function自身构造了自己,Object的__proto__隐式原型指向Function的原型对象,Function的__proto__隐式原型指向自己的prototype显式原型,也就是所谓的自己生自己,这样的话会形成一个环路死循环,所以原型链设计的时候给Object的原型对象的__proto__隐式原型指向了null,这就是原型链的终点