由于您的问题主要是文体问题(不想用一堆声明填充构造函数),因此也可以在文体上解决。
在我看来,许多基于类的语言的构造函数是一个以类名本身命名的函数。在风格上,我们可以使用它来创建一个在风格上仍然有意义的 ES6 类,但不会将构造函数中发生的典型操作与我们正在执行的所有属性声明组合在一起。我们简单地使用实际的 JS 构造函数作为“声明区域”,然后创建一个名为函数的类,否则我们将其视为“其他构造函数”区域,在真正的构造函数的末尾调用它。
“严格使用”;
我的课堂
{
// 只声明你的属性,然后调用 this.ClassName(); 从这里
构造函数(){
this.prop1 = '等等 1';
this.prop2 = '等等 2';
this.prop3 = '等等 3';
this.MyClass();
}
// 各种其他“构造函数”的东西,不再与声明混淆
我的课() {
做任何事情();
}
}
两者都将在构造新实例时被调用。
有点像拥有 2 个构造函数,您可以在其中将声明和其他要执行的构造函数操作分开,并且在风格上使人们不难理解这也是正在发生的事情。
我发现在处理大量声明和/或需要在实例化时发生的大量操作时使用它是一种很好的风格,并且希望使这两个想法彼此不同。
注意:我非常有目的地不使用典型的“初始化”(如 aninit()
或initialize()
方法)的惯用概念,因为它们的用法通常不同。构造和初始化的想法之间存在某种假定的差异。使用构造函数的人知道它们作为实例化的一部分被自动调用。看到一个init
方法,许多人会不假思索地假设他们需要按照 的形式做一些事情var mc = MyClass(); mc.init();
,因为这就是您通常初始化的方式。我不是在尝试为类的用户添加初始化过程,而是在尝试添加到类本身的构建过程中。
虽然有些人可能会暂时重复拍摄,但这实际上是重点:它向他们传达了意图是构建的一部分,即使这让他们做了一些重复拍摄并继续“那不是ES6 构造函数是如何工作的”,然后再看一下实际的构造函数,“哦,他们在底部调用它,我明白了”,这比不传达该意图(或错误地传达它)要好得多,并且可能会得到很多人们使用它错误,试图从外部和垃圾初始化它。这对我建议的模式非常有意。
对于那些不想遵循这种模式的人,完全相反的方法也可以。在开始时将声明转移到另一个函数。也许将其命名为“properties”或“publicProperties”或其他名称。然后把剩下的东西放在普通的构造函数中。
“严格使用”;
我的课堂
{
特性() {
this.prop1 = '等等 1';
this.prop2 = '等等 2';
this.prop3 = '等等 3';
}
构造函数(){
this.properties();
做任何事情();
}
}
请注意,这第二种方法可能看起来更简洁,但它也有一个固有问题,即properties
使用此方法扩展另一个类时会被覆盖。您必须提供更多独特的名称properties
才能避免这种情况。我的第一个方法没有这个问题,因为它的构造函数的假一半是以类唯一命名的。