我正在学习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();
}
}
构造函数方法究竟是什么,为什么它很重要,为什么在创建子类实例时需要调用父构造函数?
答案 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()'调用构造函数,如上所示。
额外注意:如果您未在子类上提供构造函数方法,则将调用父构造函数方法。