1.先看一下对象冒充继承方法(apply/call)
function people(type){
this.skill="跑步"
this.type=type
this.say=function(){
return "people的技能是"+this.skill
}
}
function man(type){
// people.call(this,type)
people.apply(this,[type])
this.sex="男"
}
var xiaoming=new man("human")
alert(xiaoming.skill)
alert(xiaoming.sex)
alert(xiaoming.type)
alert(xiaoming.say())
缺点:我们发现man只继承了function定义的属性,并没有继承people的原型属性。
优点:一个子类可以继承多个父类。
2.第二种方法是原型链继承
function people(){}
people.prototype.type="男"
people.prototype.run=function(){
return "people的种族是"+this.type
}
function man(){}
// 将man的原型对象指向people的实例
man.prototype=new people()//再写一个prototype会覆盖之前的prototype
man.prototype.name="小明" //写在继承语句之后
var xiaoming=new man()
alert(xiaoming.run())
缺点:原型链方法继承了原型属性,但是若改变子类对象的原型,父类对象的原型也会改变。
3.混合模式继承
(对象冒充继承属性,方法写在父类对象的原型中,子类继承原型)
function people(name,sex){
this.name=name
this.sex=sex
}
people.prototype.say=function(){
return this.name+"的性别是"+this.sex
}
// 用对象冒充继承属性
function man(name,sex){
people.call(this,name,sex)
}
//用原型链继承方法
man.prototype = new people()
var xiaoming=new man("小明")
alert(xiaoming.name)
alert(xiaoming.say())
弥补了前两种方式的缺陷,目前最好的继承方法。