class 中的 Constructor():为啥需要它?
Posted
技术标签:
【中文标题】class 中的 Constructor():为啥需要它?【英文标题】: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 中。
Why do we need a constructor in OOP?
总是有一个默认构造函数,它本质上等同于基类中的constructor()
和派生类中的constructor() super();
。你不需要构造函数,但是如果你要为你的类提供参数,你将如何在没有构造函数的情况下接受它们?
感谢大家的观点。 link 很有启发性
【参考方案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 范围内,并且可以像任何其他类成员一样在以后重新分配)。然后将类方法分配给原型并在所有实例之间共享。以上是关于class 中的 Constructor():为啥需要它?的主要内容,如果未能解决你的问题,请参考以下文章
C#和Java中的构造器constructor是啥?起啥作用?为啥不可以被override??
JAVA进阶之旅——认识Class类,反射的概念,Constructor,Fiald,Method,反射Main方法,数组的反射和实践