而寄生组合继承则是对组合继承做了优化,是最为理想的继承。ES6的extends与它基本一致,只是在实现方式上有所不同。
构造函数、原型和实例之间的关系:每个构造函数都有一个原型对象,原型对象都包含一个指向构造函数的指针,而实例都包含一个原型对象的指针。继承的本质就是复制,即重写原型对象,代之以一个新类型的实例。
用父类的构造函数增强子类实例。也就是复制父类的实例给子类(没用Prototype)
优点:(和原型链继承完全反过来)
缺点:
把上面俩方法结合起来。用原型链实现对原型属性和方法的继承,用构造函数来实现实例属性的继承。
比如现在有两个对象
现在想要让”医生”去继承”中国人”,也就是说,怎样才能生成一个”中国医生”的对象?
这里要注意,这两个对象都是普通对象,不是构造函数,所以无法使用构造函数方法实现”继承”。
可以用object()方法
利用一个空对象作为中介,将某个对象直接赋值给空对象构造函数的原型。
上面的函数本质上对传入的obj进行了一次浅拷贝,直接把构造函数F的原型指向了obj。
使用原型式继承获得一份目标对象的浅拷贝,然后增强了这个浅拷贝的能力。
优缺点其实和原型式继承一样,寄生式继承说白了就是能在拷贝来的对象上加点方法,也就是所谓增强能力。
组合继承会有两次调用父类的构造函数而造成浪费的缺点,寄生组合继承就可以解决这个问题。
核心在于inheritPrototype(subType, superType),让子类的prototype指向父类原型的拷贝,这样就不会调用父类的构造函数,进而引发内存的浪费问题。
虽然 ES6 引入了关键字 class,但是底层仍然是基于原型的实现。class 只是语法糖,使得在 JavaScript 模拟类的代码更为简洁。
THE END