原型链继承
- 在 object()函数内部,先创建一个临时的构造函数,然后将传入的对象作为这个构造函数的原型,最后返回这个临时类型的一个新实例
Star.prototype = new Person()
Star.prototype.constructor = Star
- 缺点:只能继承父类的方法
借用构造函数继承
-
在子类构造函数的内部调用超类型构造函数
-
用
apply()和call()方法在新创建的对象上执行构造函数
Person.call(this,age,name)`
- 缺点:无法复用,只能继承父类的属性
组合继承(伪经典继承)
-
将原型链和构造函数组合
-
用构造函数来实现实例属性的继承
-
在原型上定义方法实现了函数复用,又能保证每一个实例都有它自己的属性
-
会有一个小bug,里面的age,name,有两份,有一份的值为undefined,因为里面的
apply()和call()方法会自动多调用一次
寄生组合继承
-
用构造函数来继承属性
-
用原型链的混成形式来继承方法
-
用寄生式继承来继承超类型的原型,再将结果指定给子类型的原型
Star.prototype = Object.create(Person.prototype)
ES6的Class类继承方式
-
用class通过
extends来继承父类中属性和方法,super指向父类的原型对象 -
子类constructor方法中必须有super关键字,且必须出现在this之前