什么是继承呢?继承是指子类继承父类的属性和方法,便于代码的复用
原型继承
function Parent() {
}
function Child() {
}
child.prototype = new Parent()
//使子类的原型等于父类的实例,此时child.prototype.constructor 为Parent函数对象
child.prototype.constructor = child //此时child.prototype.constructor 为child函数对象
原型继承的特点:
与其他后台语言不同,其他后台语言一般是拷贝继承,把父类的属性和方法拷贝一份到子类中供子类使用,而JS是把父类的原型放到子类实例的原型链上,是基于__prototype__原型链查找机制完成
子类可以重写父类的方法并且会导致父类的其他实例也受影响
父类的私有或公有属性和方法,最后都会变成子类中公有的属性和方法
不能传参,不能实现多继承
call继承
function Parent(name,age) {
}
function Child(name, age) {
Parent.call(this, name, age) //在子类中调用父类的方法,并改变父类的this指向
}
可以将父类私有的变成子类私有的,但是不能访问父类原型上的属性和方法
可以传参可以实现多继承
不能实现函数的复用,每个子类实例都会重新调用父类实例函数
组合继承
function Parent(name,age) {
}
function Child(name, age) {
Parent.call(this, name, age) //在子类中调用父类的方法,并改变父类的this指向
}
Child.prototype = new parent()
父类私有的属性和方法变成子类私有的属性和方法,父类公有的属性和方法变成子类共同的属性和方法
函数可复用可传参
调用了两次父类构造函数,生成了两份实例
组合继承优化
function Parent(name,age) {
}
function Child(name, age) {
Parent.call(this, name, age) *//在子类中调用父类的方法,并改变父类的this指向*
}
//var B = Object,create(A),以A为对象创建B对象,B对象继承A的所有属性和方法*
Child.prototype = Object.create(Parent)
Child.prototype.constructor = Child
这个继承解决了上面继承的所有缺点,是ES5最完美的继承方式,比较推荐
ES6继承
class Parent {
constructor(name, age) {
this.name = name
this.age = age
}
}
class Child extends Parent {
constructor(name,age) {
super(name, age) //通过super调用父类方法
}
}
用类来定义构造函数,在constructor()里面定义构造函数的私有属性
通过extends实现类的继承,在子类的constructor()的第一行写下super(),来实现子类的私有属性继承父类的私有属性