js继承

js中继承的理解:

1:借助构造函数继承,如下图中,在Child构造函数中利用call关键字,强制将parent的this指向child,实现了继承,同样的也可以使用apply。                                                                                                                                                                                              js继承

但是通过此种办法,父类原型上的东西是不能够继承的。如下图所示,在Parent的原型上添加了age属性,但在child的对象没有找到此属性。所以此方法并没有实现真正的继承。

js继承

2:原型链式继承,如下图所示为原型链式继承,虽然能够得到父类原型的属性age,但是也有一个缺点,可以看到,利用child1对象对父类进行操作后,child2中也改变了数据。造成这种现象的原因是原型链上的原型对象是公用的。同样这种方式也是我们不需要的。

js继承

3;组合继承,顾名思义就是结合了构造函数和原型链继承的两种继承方式。如下图所示,利用组合继承确实解决了上述问题。

js继承

但是细心地读者可以看到,在实例化一次Child,调用了两遍父类的构造函数,第一次是Child.parototype=new Parnet();第二次是Parent.call(this)。同样这类方法也不是我们需要的。

4 组合继承第一步优化,因为在上边我们调用了两次父类构造函数,所以这次我们直接将父类的原型对象赋给子类的原型对象,如下图所示,虽然解决了调用两次的问题,但是不是区分child1和child2属于哪个类。

js继承

用instanceof关键字判断某个对象的实例无效了,还可以使用constructor来进行判断,如下图所示,可以看到child1和child2的构造函数为Parent而不是Child,这显然也是不可以的。

js继承

5 组合继承进一步优化,如下图所示,利用Object.create()创建了中间对象,并且将中间对象的constructor的属属性指向了Child,巧妙的解决了问题。

js继承

参考链接 https://www.imooc.com/article/20162