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

时间:2016-03-07 05:40:43

标签: javascript class oop constructor ecmascript-6

我正在学习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();
  }
}

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

2 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:2)

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

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()'或任何其他方法通过父类的'super.methodName()'调用构造函数,如上所示。

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