【问题标题】:Constructor() in class{}: why is it needed?class{} 中的 Constructor():为什么需要它?
【发布时间】:2021-09-17 13:12:55
【问题描述】:

基本问题:为什么类中需要构造函数?

下面是一个简单的测试:

  • 带有构造函数的圆类
  • 没有构造函数的 Circle2 类。
  • ... 但是,这两个类都可以工作并且可以创建一个实例。

回到正题,为什么类中需要构造函数?

class Circle {
  draw() {
    console.log('hello');
  }
}

c = new Circle(1);

class Circle2 {
  constructor(radius) {
    this.radius = radius;
  }
  
  draw() {
    console.log('hello');
  }
}

c2 = new Circle2(1);

【问题讨论】:

  • 您的第一个 Circle 没有半径。这似乎是添加构造函数的好理由。
  • 从技术上讲,您的示例可以正常工作,但现在尝试为这两个类添加“calcArea()”函数。您只能使用 Circle2 这样做,因为您永远不会将半径存储在 Circle1 中。
  • 总是有一个默认构造函数,它本质上等同于基类中的constructor(){}和派生类中的constructor(){ super(); }。你不需要构造函数,但是如果你要为你的类提供参数,你将如何在没有构造函数的情况下接受它们?
  • 感谢大家的观点。 link 很有启发性

标签: javascript ecmascript-6


【解决方案1】:

如果你做c.radius,它还没有被定义,但是c2.radius会是

当你没有构造函数时,你的类将接受参数但不会对它们做任何事情

【讨论】:

  • 感谢您的观点。它沉入其中,您的回答帮助我掌握了它
【解决方案2】:

当没有声明constructor 时,new 运算符只会创建一个以Circle.prototype 为原型的空对象。如果你想初始化类实例的一些属性,那么你需要一个constructor

您还有另一种选择,如果您要创建的属性不依赖于构造函数参数,那么您可以使用class fields 作为等效项:

class Foo {
  // this is equivalent to a constructor initialization but it only takes a static assignment
  bar = 'bar';
}

Class fields 在类实例上添加属性,就像 constructor 一样。

【讨论】:

  • 谢谢 Guerric,我很欣赏这个答案的深度。由此我了解到需要constructor,以便每个实例都有唯一的成员。如果我不需要唯一参数,我可以将constructor 排除在外。 (在这种情况下,一个函数或 const 可能就足够了!)如果这是在吠叫错误的概念?
  • 是的,简而言之:如果你需要依赖于构造函数参数的类成员,那么你显然需要一个构造函数。如果您需要静态分配的类成员,您可以使用类字段(它们仍然限定在类 instance 范围内,并且可以像任何其他类成员一样在以后重新分配)。然后将类方法分配给原型并在所有实例之间共享。
猜你喜欢
  • 2018-07-02
  • 1970-01-01
  • 2013-09-16
  • 2011-04-02
  • 2016-05-18
  • 1970-01-01
  • 2017-07-18
  • 1970-01-01
  • 2015-09-19
相关资源
最近更新 更多