js原型与原型链(proto、prototype、constructor)

参考文章:https://blog.csdn.net/xiaotao_css/article/details/72782416?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task
https://www.jianshu.com/p/be7c95714586
https://blog.csdn.net/cc18868876837/article/details/81211729

  1. 每一个js对象都有与之对应的原型(null除外),而原型也是一个对象,每一个对象都会从原型对象 继承 属性,原型对象也是如此
  2. __ proto __和constructor属性是对象独有的,prototype是函数独有的,但由于js中函数也是对象所有函数也拥有 __ proto __ 和prototype属性

__proto __

  1. 这个属性是对象独有的,它是从对象指向另一个(原型)对象,这个属性的作用是当访问一个对象的属性时,如果该对象内部不存在这个属性,那么就会去它的__ proto __ 属性所指向的原型对象里找,如果原型对象里也没有要找的属性,则继续从原型对象的 __ proto __ 属性再往上找,直到找到原型链的顶端null,在null上继续找相当于在null上读取属性就会出现报错,这种通过 __ proto __ 属性链接对象直到null的过程就称之为原型链

prototype

  1. 这个属性是函数独有,它是从函数指向一个对象,它的涵义是 函数的原型对象 ,也就是这个函数所创建的实例的原型对象,它的作用是可以包含所有实例共享的属性和方法,也就是让该函数所有的实例化对象们都可以找到公用的方法和属性, 任何函数在创建的时候,都会默认的同时创建该函数的 prototype对象

constructor

  1. 这个属性也是对象才拥有的,它是从一个对象指向一个(构造)函数,每个对象都有构造函数(本身拥有或继承而来), Function对象比较特殊,它的构造函数就是它自身(Function可以看成是函数也可以看成是对象),所有的函数或对象都是用过Function构造函数得来的,所以constructor的终点就是Function
为什么说每个对象都有构造函数(除了null)
  1. 其实这句话的意思是每个对象都能找到它对应的constructor属性,因为创建对象的前提就是需要constructor,这个constructor可以是本身显示定义或者通过 __ proto __ 原型链找到,而单从constructor这个属性来讲,只有prototype对象才有 ,因为每个函数在创建的时候,js都会同时创建该函数的prototype对象,而函数的实例对象.__ proto __ === 该函数.prototype,该函数的.prototype.constructor=== 该函数本身,所以通过函数创建的对象,即使自己没有constructor属性,也可以通过__ proto __ 找到对应的constructor