原型、原型链(图解)

188 阅读1分钟
  • 原型:

  • 当对象被创建时,都会拥有一个隐式原型 __proto__

  • 每个构造函数都有对应的显示原型  prototype 和隐式原型 __proto__

  • 每个对象的隐式原型都指向构造函数的显示原型

  • obj.__proto__ === Object.prototype

  • 每个原型对象都具有 constructor 属性并指向了该构造函数本身

  • **原型链:**当访问某个对象属性时,会查找自身对象上是否存在该属性,如果不存在则通过对象的隐式原型去查找,直至找到 Object 的原型对象,当 Object 的原型对象上不存在该属性时,则返回 undefined。这一条完整的查找链就称为原型链

  • 终极原型链图:


![](https://p6-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/747ad40b5603425c91c59d3b4777b0e8~tplv-k3u1fbpfcp-watermark.image?)  


**
  • 原型链四条特殊线:

  • **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 构造函数的原型对象,也就是它本身,所以会造成死循环