返回

super关键字 - 从构造函数到方法,深入解析

前端

super概述

super关键字是ES6中引入的一个重要特性,它可以用于访问父类的构造函数和方法。super关键字既可以当作函数使用,也可以当作对象使用。

super作为函数调用时,代表父类的构造函数。在子类的构造函数中,可以使用super()来调用父类的构造函数,从而初始化子类实例的属性。

super作为对象使用时,代表父类的原型对象。在子类的实例方法中,可以使用super来访问父类原型对象上的属性和方法。

super关键字作为函数使用

super关键字作为函数调用时,代表父类的构造函数。在子类的构造函数中,可以使用super()来调用父类的构造函数,从而初始化子类实例的属性。

例如,以下代码定义了一个父类Person,它具有一个name属性和一个sayHello方法:

class Person {
  constructor(name) {
    this.name = name;
  }

  sayHello() {
    console.log(`Hello, my name is ${this.name}!`);
  }
}

以下代码定义了一个子类Student,它继承自Person类。在Student类的构造函数中,使用了super()来调用父类的构造函数,并将name参数传递给父类的构造函数,从而初始化子类实例的name属性:

class Student extends Person {
  constructor(name, school) {
    super(name); // 调用父类的构造函数
    this.school = school;
  }
}

现在,我们可以使用Student类来创建学生实例:

const student = new Student('John', 'MIT');

此时,student实例将具有name和school两个属性,并且可以调用sayHello方法:

console.log(student.name); // John
console.log(student.school); // MIT
student.sayHello(); // Hello, my name is John!

super关键字作为对象使用

super关键字作为对象使用时,代表父类的原型对象。在子类的实例方法中,可以使用super来访问父类原型对象上的属性和方法。

例如,以下代码定义了一个父类Person,它具有一个name属性和一个sayHello方法:

class Person {
  constructor(name) {
    this.name = name;
  }

  sayHello() {
    console.log(`Hello, my name is ${this.name}!`);
  }
}

以下代码定义了一个子类Student,它继承自Person类。在Student类的实例方法sayGoodbye中,使用了super来访问父类原型对象上的sayHello方法:

class Student extends Person {
  constructor(name, school) {
    super(name); // 调用父类的构造函数
    this.school = school;
  }

  sayGoodbye() {
    super.sayHello(); // 调用父类的sayHello方法
    console.log(`Goodbye, my name is ${this.name}!`);
  }
}

现在,我们可以使用Student类来创建学生实例:

const student = new Student('John', 'MIT');

此时,student实例将具有name和school两个属性,并且可以调用sayHello和sayGoodbye两个方法:

console.log(student.name); // John
console.log(student.school); // MIT
student.sayHello(); // Hello, my name is John!
student.sayGoodbye(); // Goodbye, my name is John!

super关键字的注意事项

在使用super关键字时,需要注意以下几点:

  • super关键字只能在子类的构造函数或实例方法中使用。
  • super关键字作为函数调用时,必须放在子类的构造函数的第一行。
  • super关键字作为对象使用时,可以放在子类的实例方法的任何位置。
  • super关键字只能访问父类原型对象上的属性和方法,不能访问父类实例上的属性和方法。

结语

super关键字是ES6中引入的一个重要特性,它可以用于访问父类的构造函数和方法。super关键字既可以当作函数使用,也可以当作对象使用。super作为函数调用时,代表父类的构造函数。super作为对象使用时,代表父类的原型对象。理解和掌握super关键字的用法,对于编写可重用、可维护的代码非常重要。