借助构造函数实现继承
//父类
function Parent(){
this.name='parent'
}
//子类
function child(){
Parent.call(this)//修改this指向
this.type='child'
}
特点:可以实现多继承
缺点:只能继承父类实例的属性和方法,不能继承原型上的属性和方法。
借助原型链实现继承
//父类
function Parent(){
this.name='parent'
}
//子类
function child(){
this.type='child'
}
child.prototype=new Parent()
特点:基于原型链,既是父类的实例,也是子类的实例
缺点:共用了原型链上的原型,若有多个子类对象,则原型对象为同一个对象
组合方式(构造继承和原型链继承的组合)
//父类
function Parent(){
this.name='parent'
}
//子类
function child(){
Parent.call(this)
this.type='child'
}
child.prototype=new Parent()
优点:可以继承实例属性/方法,也可以继承原型属性/方法
缺点:new Parent()会执行多次
组合方式优化1
//父类
function Parent(){
this.name='parent'
}
//子类
function child(){
Parent.call(this)
this.type='child'
}
child.prototype=Parent.prototype
优点:解决了组合方式的缺点
缺点:使用instanceof 无法区分对象属于哪个类的实例对象
组合方式优化2
//父类
function Parent(){
this.name='parent'
}
//子类
function child(){
Parent.call(this)
this.type='child'
}
child.prototype=object.create(Parent.prototype)
child.prototype.constructor=child
优点:解决了组合方式1的缺点