什么是继承?
1、继承是与 构造函数 相关的应用
2、是指,让一个构造函数去继承另一个构造函数的属性和方法
3、继承是发生在两个构造函数之间的
es5中有几种常见的继承方法分别是:
- 原型的继承
- 构造函数的继承
- 混合继承(组合)
原型继承
function Parent(){
this.name = "parent";
}
Parent.prototype.show = function(){
console.log("哈哈哈");
}
function Child(){}
for(let i in Parent.prototype){
Child.prototype[i] = Parent.prototype[i];
}
let p = new Child();
p.show(); //哈哈哈
这里我们写了一个“ show ”方法在这个Parent函数里,下面的Child函数里是没有这个“ show ”方法的,但最后我们执行的时候是可以打印出’哈哈哈‘的,这里就是利用了原型继承把Parent里面的方法拷贝给了Child,让Child可以使用Parent里面所有的方法
借助构造函数继承
function Parent(s){
this.skill = s;
}
function Child(n){
Parent.call(this,n);
}
let c = new Child("哈哈哈");
console.log(c.skill); //哈哈哈
这里是利用call来改变构造函数中this指向的方法来实现继承的。但是,这样只能继承构造函数内部的属性或方法,不能继承原型身上的属性或方法
混合继承
function Parent(s){
this.skill = s;
}
Parent.prototype.show = function(){
console.log(this.skill);
}
function Child(s){
Parent.call(this, s); //构造函数继承
}
for(let i in Parent.prototype){ //原型继承
Child.prototype[i] = Parent.prototype[i];
}
let p = new Child("哈哈哈");
p.show();
混合继承就是构造函数继承+原型继承,这样写起来有一点复杂,既可以继承构造函数,又可以继承原型
ES6class继承
上面写的这三种方法都是属于ES5的,下面写一种ES6的继承方法:
class Parent{
constructor(s){
this.skill = s;
}
show(){
console.log(this.skill);
}
}
class Child extends Parent{
constructor(s){
super(s);
}
}
let p = new Parent("哈哈哈");
p.show();
ES6中有专门的语法继承,如上面所示,使用extends关键字,在里面再写一个super函数接受参数就直接继承了,并且这种方法将原型继承和构造函数继承都继承了,就等于是将混合继承封装成了这种方法