[ES6] Class中的super
程序员文章站
2022-07-13 09:13:17
...
super关键字出现的前提是使用Class的继承。
class Person { // ... }
class Student extends Person{
constructor(){
super();
}
}
为什么会有super
当类使用继承,并实例化时,
es5 的继承是先创建子类的this,然后将父类的方法添加到子类的this上去;
es6 的继承是创建父类的this对象,然后再对this对象添加方法/属性。
而super方法就是用来创建父类this对象的。
如果子类没有定义constructor方法,constructor方法会被默认创建,并默认调用super函数
class Student extends Person {
}
// 等同于上方
class Student extends Person {
constructor(...args) {
super(...args);
}
}
使用super
super既能当作方法调用也能当对象使用
当做方法调用时只有是在子类构造函数constructor方法内;
当做属性使用时,在普通方法中,指向父类的原型对象;在静态方法中,指向父类。
上图说明当super在普通方法中 super === Person.prototype;
静态方法调用
静态方法中的super指向父类
class Person {
static sport(str) {
console.log(str);
}
}
class Student extends Person {
static log() {
super.sport('调用到啦!!!');
}
}
Student.log(); // 调用到啦!!!
ES6 规定,通过super调用父类的方法时,方法内部的this指向子类。
实际上执行的是 super.sport.call(this);
super在使用时需要显式的指定出是函数调用还是属性调用。
上一篇: MybatisPlus中的分页插件的使用
下一篇: JS es6的Class类详解