原型继承
利用自定义原型的方式来实现继承关系
核心:
子类的原型指向父类的实例
可以继承父类的 属性(构造函数体内) 和 方法(构造函数原型)
缺点:
没有自己的原型
继承下来的属性不在自己身上,在原型上
不能直接修改原型上的属性和方法,可以通过__proto__
function Person(name , age){
this.name = name;
this.age = age;
}
Person.prototype.say = function(){
console.log('海贼王');
}
function Son(gender , ...arg){
//...arg 表示剩余参数,类型为一个数组,将剩余所有参数都存在数组中
this.gender = gender;
Person.call(this , ...arg)
}
let s = new Son('男' , '路飞' , 20)
console.log(s);
//输出:Son {gender: '男', name: '路飞', age: 20}
![](https://img-blog.csdnimg.cn/ddda5fcc60d64182864dc579de093d31.png)
借助构造函数方法继承
在子类中调用构造函数,使用call改变this指向,变成this指向子类的实例对象,父类上添加的属性相当于给子类实例上添加的属性
//父构造函数
function Father(name , age){
//this指向父构造函数的对象实例
this.name = name;
this.age = age;
}
//子构造函数
function Son(name , age , like){
//this指向子构造函数的对象实例
this.like = like;
Father.call(this , name , age);
//将父元素中的this运用call改变为子元素中的this
//将父类的属性和方法添加在子类自己身上
//缺点:只能继承父类的属性(构造函数体内),不能继承方法(原型上的内容)
}
var son = new Son('路飞' , 20 , '海贼王')
console.log(son);
//输出:Son {like: '海贼王', name: '路飞', age: 20}
![](https://img-blog.csdnimg.cn/e83a1a6805ac43ae88a7488f2e831f2e.png)
组合继承
将 原型继承 和 借用构造函数方式继承 结合使用
将子类的原型对象=父类上的原型对象
缺点:
重复的实例属性,一次在实例属性上,一次在原型属性上