【问题标题】:Javascript. When do I have to use constructor in child classes declaration?Javascript。什么时候必须在子类声明中使用构造函数?
【发布时间】:2019-05-08 04:50:41
【问题描述】:

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

有这个代码:

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)}

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

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

这会返回相同的结果。

我正在努力理解!谢谢你们的时间。

【问题讨论】:

  • 当我在互联网上检查时,每个人都在使用它。” - 你在哪里检查了多少样本?我当然可以找到你的反例。
  • @SazLamas 请将一个答案标记为已接受。每个这样的问题都应该有一个公认的答案。谢谢!

标签: javascript class ecmascript-6 constructor extend


【解决方案1】:

代码越少越好。因此,如果您的子类没有额外的属性并且不需要特殊的初始化逻辑,请跳过它。如果你跳过它,你会得到默认的构造函数,这完全足够了。

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

【讨论】:

    【解决方案2】:

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

    也如 MDN 解释:

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

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

    正如它所提到的,它可以存在也可以不存在。

    MDN for further understanding

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

        当您想使用子类的构造函数时,您必须使用 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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-07-03
          • 2011-03-17
          • 2012-04-26
          • 1970-01-01
          • 2013-06-17
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多