javascript - 原型继承中利用覆盖原型对象方式添加原型成员时遇到的constructor属性指向疑问?
PHPz
PHPz 2017-04-10 18:01:35
0
4
464

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

PHPz
PHPz

学习是最好的投资!

reply all(4)
左手右手慢动作

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

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

以下是我自己的总结

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


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

刘奇

Person是一个function,有constructor的:

Person.constructor === Function // true
阿神

http://www.jianshu.com/p/dee9...
可以参考一下我写的文章

左手右手慢动作

构造函数Person和他的原型对象Person.prototype都有construction

Person.prototype原型对象的construction指向构造函数本身,这个你已经知道了,所以

Person.prototype={}//这时候contruction就指向这个空对象Object了 

而构造函数Person本身也有一个construcion,他的constructor指向谁呢?答案就是这个Function,Function自己又有一个constuction,还是指向Function...Function是ECMAScript规定的本地对象

Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
About us Disclaimer Sitemap
php.cn:Public welfare online PHP training,Help PHP learners grow quickly!