javascript - 原型继承中利用覆盖原型对象方式添加原型成员时遇到的constructor属性指向疑问?

查看:146
本文介绍了javascript - 原型继承中利用覆盖原型对象方式添加原型成员时遇到的constructor属性指向疑问?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

问 题

prototype里面已经没有constructor属性,然后往它的原型对象里面找到constructor属性,为何返回的结果不一样?

解决方案

感谢题主提了个好问题,让我自己也总结了一下以前学过的知识点,哈哈,欢迎交流讨论

链接-----推荐王福明里面学习原型的博客

以下是我自己的总结

①每个函数都有一个prototype,每个对象(函数也是对象)都有一个__proto__(隐式原型)

②访问一个对象的属性的时候,如果对象没有该基本属性,则会沿着__proto__链往上查找

③对象的__proto__指向创建该对象的原型prototype

④函数是由Function函数创建,所以函数的__proto__指向Function的prototype,而Function.prototype也是一个对象,她的__proto__指向Object.prototype

⑤自定义函数和自定义对象都由function Object(){}函数创建,Object的prototype也是一个特例,她的__proto__属性指向了null

 例如:
  var p = new Person();
  对象p由Person构造函数创建,所以对象p的__proto__指向Person的prototype

__proto__链(原型链)

对象p的原型链:

p ---->  Person.prototype   ----->  Object.prototype   ----->  null

函数Person()的原型链:

Person() ----> Function.prototype ----> Object.prototype ----->  null


1.console.log(Person.constructor)

Person本身是一个函数,它的__proto__指向Function的prototype,它没有constructor属性(只有Person的prototype才有constructor属性),Person的基本属性没有constructor属性,所以它会沿着__proto__(原型链)往上查找,所以它的__proto__上一级是Function的prototype,而Function的prototype的constructor属性指向下面的结果

结果: function Function(){}


2.console.log(Person.prototype)

由于Person.prototype已经被重置为一个空的对象
所以会返回一个对象

结果: Object

但她还是一个对象,所以她还是有__proto__属性,__proto__的上一级是指向Object.prototype,而Object.prototype里面又有如题主图中所示的很多属性


3.console.log(Person.prototype.constructor)

由于Person.prototype已经被重置为一个空的对象,里面没有constructor属性,所以她会往上查找该属性,上面也提到她的__proto__的上一级是指向Object.prototype,而Object.prototype的constructor属性指向function Object(){}

结果: function Object(){}


有时间再写详细一点,欢迎指正错误

这篇关于javascript - 原型继承中利用覆盖原型对象方式添加原型成员时遇到的constructor属性指向疑问?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆