继承
<script>
//1.类的继承
class Father {
constructor() {
}
money() {
console.log(100);
}
}
class Son extends Father {
}
let son = new Son();
son.money();//100
</script>
存在一个问题,如果子类也有自己的构造函数,同时也想调用父类的求和方法,如果使用下边代码就会报错。下边的new Son时会将计算的参数传给儿子,但是却用父类的求和函数,父类求和函数是需要自己的this,传给了儿子却没传给父亲,直接调用父类方法就会报错。
class Father {
constructor(x,y) {
this.x = x;
this.y = y;
}
sum() {
console.log(this.x+this.y)
}
}
class Son extends Father {
constructor(x,y) {
this.x = x;
this.y = y;
}
}
let son = new Son(3,5);
son.sum();
super关键字
用于访问和调用对象父类上的函数,可以调用父类的构造函数,,也可以调用父类地普通函数。
调用父类构造函数
class Son extends Father {
constructor(x,y) {
super(x,y);//调用了父类地构造函数
}
}
加上super(x,y)就可以调用父类地构造函数,执行流程是,new Son后将参数xy首先传给儿子地构造函数,然后又将参数传给super(),super函数又将参数传递给父类构造函数。
调用父类普通函数
//super调用父类的普通函数
class Father {
say() {
console.log('我是你爸爸');
}
}
class Son extends Father{
say() {
console.log('我是你儿子');
}
}
let son = new Son();
son.say();//我是你儿子
1.继承中,如果实例化子类输出一个方法,先看子类有没有这个方法,如果有就先执行子类的。
2.继承中,如果子类没有,就会去查找父类有没有这个方法,如果有,就去执行父类的方法,就近原则。
class Son extends Father{
say() {
//console.log('我是你儿子');
console.log(super.say())
}
}
可以通过super.直接调用父类的普通函数。
super必须放在子类this之前
//子类继承父类加法,同时扩展减法方法
class Son extends Father{
constructor(x, y) {
this.x = x;
this.y = y;
//利用super 调用父类的构造函数
super(x,y);
}
subtract() {
console.log(this.x - this.y);
}
}
上边代码会报错,超类(父类)构造函数之前是不允许有this的,下边才是正确写法。必须先调用父类的构造函数,在使用子类的构造函数。
子类的构造函数调用时,必须先调用构造函数,也就是说子类写了构造函数,必须也有super,且先调用。
constructor(x, y) {
//利用super 调用父类的构造函数,必须在this之前
super(x,y);
this.x = x;
this.y = y;
}