ES6中super关键字有哪三种用法?

this 关键字总是指向函数所在的当前对象。ES6 又新增了另一个类似的关键字 super,指向当前对象的原型对象。

const proto = {
  foo: 'hello'
};

const obj = {
  foo: 'world',
  find() {
    return super.foo;
  }
};

Object.setPrototypeOf(obj, proto); // 为 obj 设置原型对象
obj.find(); // "hello"

super 的三种用法

  • 作为函数调用:super(...args),只能在子类构造函数里调用,代表父类的构造函数。
  • 作为对象访问属性:在子类方法中 super.prop,访问父类原型上的属性/方法。
  • 在静态方法中:super.staticMethod,指向父类的构造函数,可调用父类的静态方法。
class Animal {
  constructor(name) { this.name = name; }
  speak() { return this.name + ' makes a noise.'; }
}

class Dog extends Animal {
  constructor(name, breed) {
    super(name);              // 调用父类构造
    this.breed = breed;
  }
  speak() {
    return super.speak() + ' (Dog)';  // 调用父类方法
  }
  static info() {
    return super.info?.() || 'mammal';
  }
}

注意

  • super 不能单独引用,必须配合属性或方法使用。
  • 在箭头函数中 super 绑定外层函数作用域,行为与普通函数一致。
  • 子类构造函数里 this 只能在 super() 之后使用。

来源整理自:vue3js.cn 面试官系列