js并不是想java一样面向对象,而是基于对象,所以js是通过prototype的原型链继承
prototype
function Human(name){
this.name=name
}
Human.prototype.run=function(){
console.log("我叫“+this.name+",我在跑")
return undefined
}
function Man(name){
Human.call(this.name)
this.gender='男'
}
var f=funticon(){
f.prototype=Human.prototype
Man.prototype=new f()
Man.prototype.fight=function(){
console.log('啪啪打脸')
}
class 语法糖 (es6)
class Human{
construction(name){
this,name=name
}
run(){
console.log("我叫“+this.name+",我在跑")
return undefined
}
}
class Man extends Human{
construction(name){
super(name)
this.gender='男'
}
fight(){
console.log('啪啪打脸')
}
}
原型链继承
优点:
- 非常简便的实现了多重继承的关系;
- 能够确定原型和实例之间的关系;
缺点:
- 创建子类型实例时,无法向父类型传递参数,尤其是多重继承时,弊端非常明显;
- 所有的实例会共享通过原型链继承的属性,在一个实例中改变了,会在另一个实例中反映出来;
- 不能使用字面量添加新方法,会使继承关系中断(会重写constructor属性);
借用构造函数实现继承
优点:
- 可以通过使用call可以在调用的时候向父类型传递参数。
缺点:
- 仅仅借用构造函数,方法都在构造函数中定义,就无法实现函数复用;
- 通过借用构造函数,在父类型原型中定义的方法也无法通过原型链暴露给子类型;