1. 原型链式继承
即 子构造函数.prototype = ne
问题:不能给父构造函数传递参数,改变子级构造函数里的对象时,父级也会跟着改变,父子构造函数的原型对象之间有共享问题。
2. 借用构造函数继承
数()
注意:使用call和apply借用其他构造函数的成员, 可以解决给父构造函数传递参数的问题, 但是获取不到父构造函数原型上的成员。
3. 组合式继承
借用构造函数 + 原型式继承;
缺点:调用了两次父类构造函数(耗内存)。
4. 寄生式继承
优点:没有创建自定义类型,因为只是套了个壳子返回对象,这个函数顺理成章就成了创建的新对象。
缺点:就是给原型式继承外面套了个壳子,没用到原型,无法复用。
5. 寄生组合式继承
这是继承的最完美方式
Object.create是一种创建对象的方式,它会创建一个中间对象,把父级的原型上的方法都赋给子级
通过这种方式创建对象,新创建的对象obj的原型就是p,同时obj也拥有了属性name,这个新创建的中间对象的原型对象就是它的参数。
这种方式解决了上面的所有问题,是继承的最完美实现方式。
6. ES6中继承
Class 可以通过extends关键字实现继承,这比 ES5 的通过修改原型链实现继承,要清晰和方便很多。
输出
child hello Jimmy 羊
super
子类必须在constructor方法里调用super方法,否则不能新建实例。这是因为子类没有属于自己的this对象,而是继承了父类的this对象而对其进行加工。显然,只有调用了super方法之后,才可以使用this。
ES5继承和ES6继承的区别
在ES5中,继承实质上是子类先创建属于自己的this,然后再将父类的方法添加到this,而在ES6中,则是先创建父类的实例对象this,然后再用子类的构造函数修改this。
本文内容部分来自原文:https://www.imooc.com/article/17389