原型链继承中的prototype、__proto__和constructor的关系

前不久写了有关原型链中prototype、__proto__和constructor的关系的理解,这篇文章说说在原型链继承中的prototype、__proto__和constructor的关系。

通过以下最简单的原型链继承(省略了属性和方法)来讨论:

 1 function SuperType(){};
 2 function SubType(){};
   //继承了SuperType
 3 SubType.protoType = new SuperType();
   //创建了一个SubType的实例
 4 var instance = new SubType();

1)根据原型链中prototype、__proto__和constructor的关系这篇文章的讲解,我们可以很快知道以上代码中第1行和第2行发生如下过程:

image     image

2)接着,看第3行代码,我们先不管如何继承。第3行代码通过调用构造函数SuperType()创建了一个实例,并把这个实例赋给乐SubType的原型对象SubType.prototype;如果弄懂了原型链,我们可以很快知道这个时候SubType的原型对象的__proto__指针指向SuperType的原型对象:

image

(此图是错误的,以下将讲解正确的过程及原因)

3)按照之前讲的原型链知识,过程应该如上图所示。但这里有一点要注意,第3行代码实际上是重写了SubType的原型对象,也就是说现在的SubType原型对象和第2行代码中的SubType原型对象不是同一个对象了。那么此SubType的原型对象与SubType之间的联系constructor 属性就断开了,那它没有了自己的constructor属性,它就会从SuperType的原型对象那继承,所以SubType原型对象的constructor属性指向SuperType。过程可表示如下:

image

最终的结果就是:

image

console.log(SubType.prototype.constructor === SuperType);//true

4)接着,第4行代码通过调用SubType()构造函数创建了一个实例instance,很自然instance的__proto__就指向了SubType的原型对象,而其constrcutor属性就继承SubType 原型对象的constrcutor属性,SubType 原型对象的constrcutor属性是继承自SuperType,那么instance的constructor就追溯到指向了SuperType。

image

console.log(SubType.prototype.constructor === SuperType);//true
  console.log(instance.constructor === SuperType);//true
posted @ 2017-05-11 13:15  小丸子的城堡  阅读(537)  评论(4编辑  收藏  举报