segmentfault官方|深入挖掘原型链
北京联盟_本文原题:深入挖掘原型链
本文转载于 SegmentFault 社区
作者:forceddd
1.原型对象 , 实例对象与构造函数
如果想要深入理解原型链 , 首先需要明确知道什么时原型对象 , 什么是实例对象 , 以及原型对象 , 实例对象与构造函数三者之间的关系 。
首先 , 实例对象是指通过关键字new , 由构造函数构造出的对象实例对象可以有多个 , 并且实例对象会继承它的原型对象上的所有属性 。
f1与f2就是由构造函数Foo通过关键字new创建的两个实例对象 。
同一个构造函数的实例对象的原型对象是同一个 , 是构造函数的prototype属性 , 在实例对象上可以通过__proto__属性获取 。 即:
2.原型对象 , 实例对象和构造函数三者的关系
每个实例对象的原型对象上都有一个constructor属性 , 这个属性指向实例对象的构造函数 , 实例对象可以从它的原型对象上继承该属性 。
三者的关系听起来十分绕口 , 但是用代码体现就很清晰了:
实例对象f1 , 构造函数Foo , 原型对象Foo.prototype===f1.__proto__
1.js中规定 , 所有的对象都有自己的原型对象 , 原型对象和和函数也是对象 , 所以他们也有自己的原型对象(__proto__) , 因此会形成原型链 。
2.js中读取属性和方法的规则:js引擎会首先在对象本身查找属性和方法 , 如果找不到就会沿着原型链逐层向上查找 , 最终找不到就会返回undefined 。 如果找到了就不会再继续查找 , 所以当一个实例对象和它的原型对象上具有同名属性或方法时 , 只会查找到对象本身的属性或方法 。
使用图示可以更好地理解原型链:
以上这段代码:
首先有实例对象 , 构造函数和原型对象
原型对象的constructor指向构造函数 , 实例对象继承的constructor也是指向构造函数 , 实例对象和构造函数的__proto__和prototype指向同一个原型对象 。
本文插图
【segmentfault官方|深入挖掘原型链】
然后 , 因为Foo.prototype也是一个对象 , 他也具有自身的原型对象__proto__,由三者关系我们可以知道,Foo.prototype.__proto__.constructor应该指向Foo.prototype的构造函数 , 输出结果是Object,即Foo.prototype.__proto__.constructor===Object , 并且Object.prototype也应该有自己的原型对象 , 输出为null 。
所以有:
本文插图
再然后 , 构造函数Foo和Object也是实例对象 , 他们也应该由自己的原型对象__proto__ , 而所有的函数都是由构造函数Function构造的 , 所以Object.__proto__===Function.prototype , Foo.__proto__===Function.prototype,Object.__proto__===Foo.__proto__,并且Function.prototype也有自己的原型对象__popto__ , 指向了Object.prototype,可以画出:
推荐阅读
- 滨海融媒|乾隆取名的山东美食,外地人连它的名字都读不对
- 环球最旅行官方|福建在“田园之上”的城市:坐拥1300多年建城史,环境不输厦门
- 美食杰官方|酸奶千万不要隔夜喝,喝一次比喝假酒的危害还大,还不进来看看
- 美食杰官方TB|肠道“推粪机”被发现,3块炒一大盘,清肠通便,隔天排空黑宿便
- 美食杰官方|每天早上喝1杯,补升阳气,阳气足,女人脸色红润,精神足自然美
- 美食杰官方|香蕉和它是绝配,女人常吃润肠排宿便,消暑下火,吃出易瘦体质
- 趣头条|官方指导价:9.68-14.98万 2019款名爵6最高现金优惠1万元
- 美食杰官方|夏天到了,这食材抓紧吃,是菜也是药,清热下火,错过等明年
- 汽车|大鼻孔新一代4系双门跑车,官方:避免陷入一片平庸的海洋
- 深圳潮生活官方|2000+㎡的「时尚宇宙母舰」“降落”福田!鞋控们的天堂来了