【4期】彻底搞懂JS原型继承之——__proto__、prototype、constructor

__proto__

__proto__属性指向原型对象,也可以理解为父类对象。

prototype

函数的原型对象,给其它对象提供共享属性,函数所独有的。所有对象,都可以作为另一个对象的 prototype。

原型链

当你在访问一个对象属性的时候,如果该对象内部不存在这个属性,那么就回去它的__proto__属性所指向的对象(父类对象)上查找,如果父类对象依旧不存在这个属性,那么就回去其父类的__proto__属性所指向的父类的父类上去查找。以此类推,知道找到 null。而这个查找的过程,也就构成了我们常说的原型链。

constructor

constructor属性是一个对象指向该对象的构造函数。对象所独有属性。

每一个对象都有其对应的构造函数,本身或者继承而来。

 

 


别放弃,马上柳暗花明了

 

__proto__与prototype

 

function Father(){ this.a =1; } // Father是函数对象

let child = new Father() // child是普通对象

  • Father._ proto_ === Function.prototype  // 函数对象的原型指向函数的原型对象
  • Function._ proto_ === Function.prototype // Function的原型指向函数原型对象
  • Object._ proto_ === Function.prototype //Object的原型指向函数原型对象
  • Function.prototype._ proto_ === Object.prototype //Function的原型对象的原型指向Object的原型对象

 

  • child._ proto_ === Father.prototype   //child 的原型指向构造函数Father的原型对象
  • Father.prototype._ proto_ === Object.prototype  //Father 的原型对象的原型指向Object的原型对象
  • Object.prototype._ proto_ === null   //Object的原型对象的原型指向null【原型链顶层】

 

prototype与constructor

1.函数.prototype.constructor===该函数本身

===》过函数创建的对象即使自己没有constructor属性,它也能通过__proto__找到对应的constructor,所以任何对象最终都可以找到其对应的构造函数。

2.特殊情况:

Function:它是它自己的构造函数。所以Function.prototype === Function.__proto。

 

__proto__、prototype与constructor关系

(注:虚线表示继承而来的 constructor 属性)

【4期】彻底搞懂JS原型继承之——__proto__、prototype、constructor