Javascript。什么时候必须在子类声明中使用构造函数?

时间:2018-12-06 13:13:42

标签: javascript class ecmascript-6 constructor extend

我想知道我是否做得正确...

具有此代码:

class Room {
 constructor(type, size, hasWindows, equipment) {
    this.type       = type;
    this.size       = size;
    this.hasWindows = hasWindows;
    this.equipment  = ['esterillas', ...equipment];
 };
};  

class PilatesRoom extends Room {

};

const room1 = new PilatesRoom('pilates', 20, true, ['balón medicinal'])
console.log(room1);
//returns: PilatesRoom {type: "pilates", size: 20, hasWindows: true, equipment: Array(2)}

我的意思是...我真的不需要使用“构造函数”和“超级”来使其完美运行,但是当我在Internet上对其进行检查时,每个人都在使用它。我是不是该?例如:

class PilatesRoom extends Room {
 constructor(type, size, hasWindows, equipment) {
  super(type, size, hasWindows, equipment)
 };
};

这将返回相同的结果。

我想了解!谢谢你们的时间。

4 个答案:

答案 0 :(得分:1)

如果没有添加任何逻辑,则不必添加子类构造函数。 (实际上,静态分析和代码质量工具有时会将其标记为“无用的构造函数”并给出警告。)

一些程序员更喜欢构造函数的显式定义,有些可能会继承其他语言的习惯(可能需要它),等等。但是,除非子构造函数实际上为子类做一些事情,而不仅仅是将相同的值传递给子类。父构造函数,没有必要。

答案 1 :(得分:0)

要使用子类的构造函数时,必须使用super()表达式。否则,您不必。就这么简单。

class PilatesRoom extends Room {
 // the constructor should be removed (there is no point to keep it):
 constructor(type, size, hasWindows, equipment) { 
  super(type, size, hasWindows, equipment)
 };
};

在上面的代码中,没有理由定义构造函数。但是,在下面的代码中,您必须调用foo(),因此,您还必须使用super()

class PilatesRoom extends Room {
 constructor(type, size, hasWindows, equipment) {
  super(type, size, hasWindows, equipment)
  foo()
 };
};

此处有更多信息:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/super#Description

答案 2 :(得分:0)

更少的代码更多。因此,如果您的子类没有其他属性并且不需要特殊的初始化逻辑,请跳过它。如果您跳过它,则会得到默认的构造函数,这已经足够了。

您需要维护每一行代码。如果没有线路,就无需维护。

答案 3 :(得分:0)

据我所知,类构造函数只是javascript中的语法糖,因此您不必使用它。

还有MDN的解释:

“构造方法是一种用于创建和初始化使用类创建的对象的特殊方法。只能在类中只有一个名称为“ constructor”的特殊方法。SyntaxError将是如果该类包含一个以上的构造函数方法,则抛出该异常。

构造函数可以使用super关键字来调用超类的构造函数。“

如前所述,它可以存在或不存在。

MDN for further understanding