function Father(){
this.age=10
this.phone={
first:"华为",
second:"小米"
}
}
Father.prototype.getage=function(){
return this.age
}
function Son(name,money){
this.name=name
this.money=money
}
Son.prototype=new Father() //子类型的原型为父类型的一个实例对象
Son.prototype.constructor=Son //让子类型的原型的constructor指向子类型
Son.prototype.getmoney=function(){
return this.money
}
var son=new Son("小米",1000)//
var son2=new Son()
console.log(son.age)//10
console.log(son.getage())//10
console.log(son.name)//小米
console.log(son.getmoney())//1000
console.log(son instanceof Son)//true
console.log(son instanceof Father)//true
son.phone.first="魅族"//更改一个子类的引用属性,其他子类也会受影响
console.log(son2.phone.first)//魅族
优点:1.通过子类实例可以直接访问父类原型链上和实例上的成员
2. 相对简单
缺点:1.创建子类实例时,无法向父类构造函数传参
2.父类的所有引用属性会被所有子类共享,更改一个子类的引用属性,其他子类也会受影响
二.构造函数继承:
原理:在子类构造函数中调用父类构造函数,可以在子类构造函数中使用call()和apply()方 法改变this指向
function Father(name,age){
this.name=name
this.age={age:age}
}
Father.prototype.getname=function(){
return this.name
}
function Son(name,age,money){
Father.call(this,name,age)//修改Father的this
this.money=money
}
Son.prototype.getmoney=function(){
return this.money
}
var son=new Son("小明",12,1000)
var son2=new Son("小李",11,999)
console.log(son.name)//小明
console.log(son.getname())//报错 无法继承父类原型上的属性与方法
console.log(son.money)//1000
console.log(son.getmoney())//1000
console.log(son instanceof Father)//false
console.log(son instanceof Son)//true
console.log(son.age.age)//12
console.log(son2.age.age)//11 父类的引用属性不会被共享
优点:1.可以在子类实例中直接向父类构造函数传参
2.父类的引用属性不会被子类共享
缺点:1.无法继承父类原型上的属性与方法