类的本质上就是自定义构造函数的另外一种写法所以类也可以实现继承
类是如何实现继承的?
//语法:
// 类名 extends 类名 {}
//代码验证:
class Father {
//在构造函数中设置了两个实例属性
constructor(uname, uage) {
this.uname = uname;
this.uage = uage;
}
//设置公共方法
eat() {
console.log('正在吃饭中....');
}
}
//son中也会有name,age ,eat方法再写一遍完全没必要
//可以让son继承父类
class Son extends Father {}
let zs = new Son('张三', 23);
zs.eat();
console.log(zs);
详解super()
class Father {
constructor(uname, uage) {
this.uname = uname;
this.uage = uage;
}
eat() {
console.log('父类中的eat正在吃饭中....');
}
}
//Son类是不是也可以设置自己的构造函数和方法
class Son extends Father{
//自己的构造函数
//会报一个语法错误: 必须要在this之前通过super调用构造函数
constructor(uname,uage, uheight) {
//调用父类中的构造函数
super(uname, uage);
this.uheight = uheight;
}
eat() {
//调用父类中的方法
super.eat();
console.log('这是子类中的eat方法');
}
}
//通过类创建实例对象zs
let zs = new Son('张三', 23, 180);
//原型链的理论
zs.eat();
console.log(zs);
总结:
// 1. 如果子类继承了父类,且子类中拥有自己的构造函数,那么必须在子类构造函数this之前通过
// super调用父类的构造函数
// 2. 就是因为当前类中有自己的构造函数了又要访问父类中的属性,就必须通过super关键字调用
// 不要使用call调用(super是es6中与类配合使用的一个关键字)
//3. 在类的继承中,如果子类中有与父类相同的方法,那么在方法执行的时候,完全按照原型链的顺序执行
//4. 如果在子类中也要执行父类中相同的方法,通过super调用父类中的方法即可
//5. super关键字有两个作用:
//a): 在构造函数中用来调用父类构造函数
//b): 在方法中super用来调用父类中的方法