这是我参与8月更文挑战的第27天,活动详情查看:8月更文挑战
前文讲了四个理解原型链图重要的概念,也是理解我今天手撕原型链图的理论基石,如果读者还不了解,欢迎点击链接原型链四个重要概念回顾
为了方便读者阅读,我把图片再拿过来一下
这回我们一点一点看,一点一点的把它撕碎!!!gogogo
第一部分
能看出运用哪条概念吗?最重要的一条,第一条 构造函数的prototype属性与实例对象的__proto__属性指向相同一个原型对象
注:这里我用了
蓝色的画笔代表实例对象去原型对象的路线了;绿色的画笔代表构造函数去原型对象的路线,后面也都是用这样的表示方法,后面对此不再注解。
f1.__proto__ === Foo.prototype // true
同理还有:
o1.__proto__ === Object.prototype // true
第二部分
从上面的启发能看出来吗?这是运用了第二条!函数也是对象,所有的函数都是对象,function Object()、function Foo()、function Function()等等一系列的函数既是对象也是函数!这就意味着函数也有实例对象的__proto__属性,可以进而得到这些函数对象是由构造函数Function构造而来。是不是感觉也不过如此么哈哈哈,我也觉得是这样的
Foo.__proto__ === Function.prototype // true
Object.__proto__ === Function.prototype // true
Function.__proto__ === Function.prototype // true
-> 进而可以推论出:
Foo.__proto__ === Object.__proto__ === Function.__proto__ // true
第三部分
之前我也有疑惑,为什么原型对象的上一级是Obejct.prototypr?后来我理解了一句话:原型对象也是对象之后也就恍然大悟,看图上的o1 o2实例对象,它们是由构造函数function Object()创建而来,所以它们的__proto__和prototype指向Object.prototype原型对象。我们再来回味那句:原型对象也是对象,明白了吗?原型对象也是由构造函数function Object()创建而来,所以它们的__proto__也指向Object.prototype
因为Obejct.prototype也是对象,所以也有__proto__属性,但是它没有上级了,所以Obejct.prototype.__proto__ = null,这里我就一起表示出来了
汇总
再把上面画的图合并起来,再来看这张组传图谱是不是清晰了很多?哈哈哈
另外聪明的小伙伴相信已经看到了,constructor这个属性我从头到尾都没有提到过,因为我觉得相比__proto__和prototype来说这个属性的级别就低了那么一丢丢。
constructor这个属性是原型对象指回构造函数的,并且这属性值可以被修改
f1.__proto__.constructor
// 修改前的值
// ƒ Foo(name) {
// this.name = name
//}
f1.__proto__.constructor = '' // // 修改后的值 ""
小结
其实说到底,原型链始终都是围绕这句实例对象 的 __proto__ 属性 与 构造函数 的 prototype 属性 指向同一个原型对象展开的!
如果对本文相关概念不清楚的同学,欢迎返回看一看我前一篇讲述的原型链四个重要概念 ✍