扫码关注官方订阅号
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(){}
有时间再写详细一点,欢迎指正错误
Person是一个function,有constructor的:
Person.constructor === Function // true
http://www.jianshu.com/p/dee9...可以参考一下我写的文章
Person.prototype原型对象的construction指向构造函数本身,这个你已经知道了,所以
Person.prototype={}//这时候contruction就指向这个空对象Object了
而构造函数Person本身也有一个construcion,他的constructor指向谁呢?答案就是这个Function,Function自己又有一个constuction,还是指向Function...Function是ECMAScript规定的本地对象
微信扫码关注PHP中文网服务号
QQ扫码加入技术交流群
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
PHP学习
技术支持
返回顶部
感谢题主提了个好问题,让我自己也总结了一下以前学过的知识点,哈哈,欢迎交流讨论
链接-----推荐王福明里面学习原型的博客
以下是我自己的总结
①每个函数都有一个prototype,每个对象(函数也是对象)都有一个__proto__(隐式原型)
②访问一个对象的属性的时候,如果对象没有该基本属性,则会沿着__proto__链往上查找
③对象的__proto__指向创建该对象的原型prototype
④函数是由Function函数创建,所以函数的__proto__指向Function的prototype,而Function.prototype也是一个对象,她的__proto__指向Object.prototype
⑤自定义函数和自定义对象都由function Object(){}函数创建,Object的prototype也是一个特例,她的__proto__属性指向了null
__proto__链(原型链)
对象p的原型链:
函数Person()的原型链:
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的:
http://www.jianshu.com/p/dee9...
可以参考一下我写的文章
构造函数Person和他的原型对象Person.prototype都有construction
Person.prototype原型对象的construction指向构造函数本身,这个你已经知道了,所以
而构造函数Person本身也有一个construcion,他的constructor指向谁呢?答案就是这个Function,Function自己又有一个constuction,还是指向Function...Function是ECMAScript规定的本地对象