继承的思想就好比中华千年文化留存是一样的,通过一年一年的传承,祖先一代一代地繁衍,才有了多姿多彩的今天。
JavaScript是如何实现继承,并不断完善迭代的呢?
接下来让我们一点一点,循序渐进地讲解,如果一代一代升级继承。
一:原型链继承
原理:利用__proto__指向父类的原型对象来实现链式继承
实现:

原型继承实现
缺点:有两个
其一,链式调用注定会出现共享问题,即子类实例化出来的父类是共享的,只要有其中一个子类改变了,则所有的其他子类也会改变

原型继承缺点一
其二,没法给父类传递初始化数据。

原型继承缺点二
既然原型继承有缺点,那根据达尔文的进化论,适者生存,看看我们如何一点点取其精华去其糟粕。
二:构造函数继承
原理:在子类中通过使用call,bind等来改变函数的作用环境,就可以解决原型链的两个缺点。当然call或者bind其实就是在子类中的变量在父类中执行了一遍。
实现:

构造函数继承
缺点:该继承虽然解决了链式继承的共享属性和没法传递参数的问题。但也带来了一个问题,即没有链式继承的优点,即没法得到父类的父类,就是爷爷辈的优良传统。这不是忘祖吗?会被骂的啊。那该如何解决这个问题呢?
三:组合继承
原理:既然构造函数继承解决了链式继承的缺点,缺少链式继承的优点。那把他们两个组合起来是不是就能解决这个问题了?
实现:

组合继承实现
到此,难道这就是最优的继承方式了吗?难道必有比它更好地继承了吗?
缺点:组合继承调用了两遍父类构造函数。
四:寄生组合式继承
原理:利用构造函数继承和原型式继承,依托于原型prototype创建一个对象,同时又可以拓展新对象来实现。
实现:

寄生组合实现
在详细解读一下:首先由于构造函数继承已经执行了一遍父构造函数方法,我们只是需要父类原型对象的属性和它原型的内容(就是解决构造函数中的缺点,我想要你的属性和你祖祖辈辈的好东西,但我又不想在执行一遍你的方法)。所以才会出现,直指要害,既然你要我的prototype上的东西,那我就拷贝一份给你,通过inheritObject方法得到爷爷辈的属性内容,再将爷爷认的儿子砍掉,直接认孙子(爷爷的constructor指向孙子,孙子的prototype也指向爷爷)。
到此javaScript中的继承就梳理完成,之所以要补充一篇继承再里面,是后面的设计模式中会使用一部分继承方法,这里讲解一遍。
流程线下
原型链继承
构造函数继承
组合继承
寄生组合式继承
多多关注一下,后面真的要开始以故事的形式讲解设计模式了