你们好,我是苏日俪格,本文是面向对象的第三部分,纯属我的理解,有哪里不对的地方请在评论区指出,你们一块儿学习共同进步。浏览器
想要知道__proto__& prototype的关系,就得先了解这两者分别是什么?函数
一个对象的隐式原型指向构造该对象的构造函数的原型:(new Object()).__proto__ === Object.prototype
学习
显式原型的做用:用来实现基于原型的继承与属性的共享。
隐式原型的做用:构成原型链,一样用于实现基于原型的继承。举个例子,当咱们访问obj这个对象中的x属性时,若是在obj中找不到,那么就会沿着__proto__依次查找。this
若是子类的原型等于父类的实例,因为父类的实例是一个对象,对象只有__proto__,那么子类的原型也只有__proto__属性,由于父类实例的__proto__指向父类构造的原型,因此子类的原型的__proto__就等于父类构造的原型prototype
谨记二者的特色和关系,由于原型链的原理就是创建在这基础上的,若是这里理解不了,那么整个面向对象的部分就全垮掉了,为了帮助码农们更好地理解,我把在网上找到的这个小可爱给你们献上来:指针
这个图片看似凌乱,其实这块的原理都在这个图上充分的展示了,根据这幅图再配上点文字的辅助,给你们呈现如下内容:
图中就是利用构造函数建立多个对象的过程,Foo构造函数的原型属性prototype指向了原型对象Foo.prototype,在原型对象里有全部构造函数建立的实例的共享的方法和属性,而该原型对象的constructor又指向了构造函数自己,全部实例(f1和f2)的隐式原型指针都指向了构造函数的原型对象,这样实例就能够访问原型对象的所有方法和属性了;而Foo除了是一个函数以外也是一个对象,所以就有了一个__proto__属性,该属性是一样的道理,指向了该函数的构造函数的原型对象(即Function.prototype),Object()依然是这个道理,全部对象的祖宗归根到底还不是Object嘛,所以最上层就是Object,在往上就是null,这个理解了,那原型链也就迎刃而解了code
若是到如今对原型链仍是有些模糊的话,让咱们来看一个原型链的例子吧:对象
function Person(){} function Father(){} Father.prototype = new Person(); function Child(){} Child.prototype = new Father(); let child = new Child(); console.log(child);
控制台:blog
Child的[[prototype]]的最外层就是Object,Object.__proto__就是null,这就是原型链,这也证明了Person的原型的constructor就是它自己继承
原型链咱们也懂了,看一看实现对象继承的几种方法吧
本文的全部内容均是一字一句敲上去的,但愿你们阅读完本文能够有所收获,由于能力有限,掌握的知识也是不够全面,欢迎你们提出来一块儿分享!谢谢O(∩_∩)O~