在ES2015中定义一个类,构造函数方法是什么以及为什么它是必不可少的

Defining a Class in ES2015, what is the constructor method and why is it essential?

本文关键字:是什么 方法 为什么 必不可少 构造函数 定义 ES2015 一个      更新时间:2023-09-26

我正在学习ES2015,但我并不完全了解课程的所有内容。据我了解,您定义了这样的类:

class Parent {
  constructor() {
    // ...
  }
}

还有一个子类,如下所示:(其中必须调用 super() 才能最初从父类运行构造函数)。

class subClass extends Parent {
  constructor(name, description, url) {
    // subclass must call super to invoke the parent's constructor method
    super();
  }
}
构造

函数方法到底是什么,为什么它很重要,为什么在创建子类的实例时需要调用父构造函数?

当您创建类的新实例时,将使用您传递的参数调用构造函数方法。在此函数中,放置任何代码来构造类的实例,例如初始化属性。

class Person{
  constructor(name){
    this.name = name;
  }
  sayHi(){
    alert(`${this.name} says hello!`);
  }
}
let person = new Person('Jerry');//this param will be send to the constructor method
person.sayHi();

此代码的结果将是一个警报,说"杰瑞说你好!
虽然,构造函数方法不是必需的。以下代码也可以工作。

class Person{
  sayHi(){
    alert("Someone says hello!");
  }
}
let person = new Person();
person.sayHi();

如果您有子类,则可能需要调用父类的构造函数方法。这也不是必需的,但在大多数情况下会完成。

class Person{
  constructor(name){
    this.name = name;
  }
  sayHi(){
    alert(`${this.name} says hello!`);
  }
}
class SophisticatedPerson extends Person{
  constructor(name){
    super(name);//this will call the constructor method of the Person class
  }
  sayHi(){
    alert(`${this.name} says: Top of the hat to you, sir!`);
  }
  oldSayHi(){
    super.sayHi();//call sayHi of the Person class
  }
}
let person = new SophisticatedPerson('Jerry');
person.sayHi();//calls the overidden sayHi method of SophisticatedPerson class
person.oldSayHi();//calls the oldSayHi of SophisticatedPerson class which calls sayHi of Person class

使用"super",您可以通过父类的"super.methodName()"通过"super.methodName()"调用构造函数,如上图所示。

额外通知:如果未在子类上提供构造函数方法,则将调用父构造函数方法。

构造

函数方法是在使用 new 关键字构造对象时调用的方法。它用于初始化对象的基本属性。

必须调用父构造函数的原因是(除了这是定义"语言规则"的方式这一简单事实之外)是需要允许父类进行初始化。

这些是许多 OOP 语言中相当基本的常见概念。