1. js继承几种方式
- 原型链继承
function Father(){
this.fatherProp=true
}
Father.prototype.getFatherValue=function(){
return this.fatherProp
}
function Son(){
this.sonProps=false
}
Son.prototype=new Father()
Son.prototype.getValue=function(){
return this.sonProps
}
var son=new Son()
console.log(son.getFatherValue())
为啥子类会继承父类的方法(也就是此类方法继承的原理)?那是因为寻找某个属性和方法时候首先会在该对象上找,找不到的话,会向对象的原型上找也就是son.prototype上找,找不到继续像son.prototype.__proto__找也就是上面代码父类的prototype,直到找到最顶端Object.prototype,找不到的话就会报错
2:构造函数继承
核心:在子级构造函数中调用父级构造函数,如何实现在一个构造函数中调用另一个函数–》apply和call
缺点:破坏了复用性。因为每个实例都创建了一份副本。
function Father(){
this.arr=[1,5,9]
}
function Son(){
Father.call(this)
}
var son1=new Son()
console.log(son1.arr)
var son2=new Son()
son2.arr.push(44)
console.log(son2.arr)
console.log(son1.arr)
//解决传参问题
function Father(name){
this.name=name
}
function Son(name){
Father.call(this,name)
}
var son1=new Son("小敏")
console.log(son1.name)//小敏
var son2=new Son("yidenng")
console.log(son2.name)//yideng
3:组合继承方式(原型链加构造函数继承),取长补短:利用原型链继承需要共享的属性和方法,用构造函数继承各自的属性和方法
function Father(name){
this.name=name
this.arr=[1,5,89]
}
Father.prototype.getName=function(){
console.log(this.name)
}
function Son(name,age){
Father.call(this,name)
this.age=age
}
Son.prototype=new Father()
Son.prototype.constructor=Son
Son.prototype.getAge=function(){
console.log(this.age)
}
var son1=new Son("xiaoming",23)
son1.arr.push(99)
console.log(son1.arr)//1,5,89,99
son1.getName()//xiaoming
son1.getAge()//23
var son2=new Son("一灯",29)
console.log(son2.arr)//1,5,89
son2.getAge()//29
son2.getName()//一灯