为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

LEATH 2018-09-13 14:13:25
prototype里面已经没有constructor属性,然后往它的原型对象里面找到constructor属性,为何返回的结果不一样?
查看完整描述

1 回答

?
不负相思意

TA贡献1777条经验 获得超10个赞

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

https://img1.sycdn.imooc.com/5bd51eba0001839804370526.jpg

以下是我自己的总结

①每个函数都有一个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(){}


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


查看完整回答
反对 回复 2018-10-28
  • 1 回答
  • 0 关注
  • 749 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信