-
原型:
-
当对象被创建时,都会拥有一个隐式原型 __proto__
-
每个构造函数都有对应的显示原型 prototype 和隐式原型 __proto__
-
每个对象的隐式原型都指向构造函数的显示原型
-
obj.__proto__ === Object.prototype
-
每个原型对象都具有 constructor 属性并指向了该构造函数本身
-
**原型链:**当访问某个对象属性时,会查找自身对象上是否存在该属性,如果不存在则通过对象的隐式原型去查找,直至找到 Object 的原型对象,当 Object 的原型对象上不存在该属性时,则返回 undefined。这一条完整的查找链就称为原型链
-
终极原型链图:

**
-
原型链四条特殊线:
-
**Function.__proto__ === Function.prototype
** -
它是一个身份的标识,如果
Function的原型链上没有出现Function的原型对象,它就不能被称为函数,因为它将无法使用函数原型对象上的方法,最多只能被称为伪函数 -
****Object.__proto__ === Function.prototype
-
原因同1,
Object构造函数本身就是一个函数,如果Object的隐式原型不指向 Function 的显示原型,则无法使用函数身上的方法(call、bind、apply...) -
******Function.prototype.__proto__ === Object.prototype
-
如果没有这条线,那么 js 原型链上就会出现两个顶点(
Function.prototype.__proto__、Object.prototype.__proto__),函数就不再是对象,所有函数就无法使用对象上的方法 -
********Object.prototype.__proto__ === null
-
Object的原型对象也是一个对象,此时如果该隐式原型不指向 null 的话会指向Object构造函数的原型对象,也就是它本身,所以会造成死循环