码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2017-05-11 14:31:51      阅读:138      评论:0      收藏:0      [点我收藏+]

标签:struct   href   logs   cto   没有   错误   margin   函数   tom   

前不久写了有关原型链中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行发生如下过程:

技术分享     技术分享

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

技术分享

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

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

技术分享

最终的结果就是:

技术分享

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

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

技术分享

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

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

标签:struct   href   logs   cto   没有   错误   margin   函数   tom   

原文地址:http://www.cnblogs.com/youhong/p/6840483.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!