あなたの問題はほとんどが文体的であるため(コンストラクターを一連の宣言で埋めたくない)、文体的にも解決できます。
私の見方では、多くのクラスベースの言語では、コンストラクターがクラス名自体にちなんで名付けられた関数になっています。スタイル的にはそれを使用して、スタイル的には意味のある ES6 クラスを作成できますが、コンストラクターで行われる典型的なアクションを、実行中のすべてのプロパティ宣言とグループ化することはありません。実際の JS コンストラクターを「宣言領域」として使用するだけで、それ以外の場合は「他のコンストラクターのもの」領域として扱う function という名前のクラスを作成し、真のコンストラクターの最後でそれを呼び出します。
"厳密に使用";
クラス MyClass
{
// プロパティのみを宣言してから、this.ClassName() を呼び出します。ここから
コンストラクタ(){
this.prop1 = '何とか1';
this.prop2 = 'なんとか2';
this.prop3 = '何とか 3';
this.MyClass();
}
// 他のあらゆる種類の「コンストラクター」のもので、もはや宣言でごちゃごちゃしていません
私のクラス() {
doWhatever();
}
}
新しいインスタンスが構築されると、両方が呼び出されます。
宣言と実行したい他のコンストラクターアクションを分離する2つのコンストラクターを持つようなもので、スタイル的にも、それが起こっていることを理解するのがそれほど難しくありません。
多くの宣言や、インスタンス化で発生する必要がある多くのアクションを処理し、2 つのアイデアを互いに区別したい場合に使用するのに適したスタイルだと思います。
注init()
: 「初期化」の典型的な慣用的な考え方 ( orinitialize()
メソッドなど)は意図的に使用しません。構築と初期化の考え方には、ある種の推定上の違いがあります。コンストラクターを使用すると、インスタンス化の一部として自動的に呼び出されることを人々は知っています。メソッドを見ると、init
多くの人が の形式に沿って何かを行う必要があることを一目見ずに想定しvar mc = MyClass(); mc.init();
ます。クラスのユーザーの初期化プロセスを追加しようとしているのではなく、クラス自体の構築プロセスに追加しようとしています。
一部の人々は一瞬二刀流をするかもしれませんが、それは実際にはちょっとしたポイントです: 意図が建設の一部であることを彼らに伝えます.どうやって ES6 コンストラクターが機能するか」を見て、実際のコンストラクターをもう一度見て、「ああ、彼らは一番下でそれを呼び出しているようですね」間違った使い方をしたり、外部から初期化しようとしたり、ジャンクしたりする人。これは、私が提案するパターンに対して非常に意図的なものです。
そのパターンに従いたくない場合は、正反対の方法も有効です。最初に宣言を別の関数にファームアウトします。「プロパティ」または「publicProperties」などの名前を付けてください。次に、残りのものを通常のコンストラクターに入れます。
"厳密に使用";
クラス MyClass
{
プロパティ() {
this.prop1 = '何とか1';
this.prop2 = 'なんとか2';
this.prop3 = '何とか 3';
}
コンストラクター() {
this.properties();
doWhatever();
}
}
この 2 番目のメソッドはよりきれいに見えるかもしれませんが、properties
このメソッドを使用するクラスが別のクラスを拡張するときにオーバーライドされるという固有の問題もあります。properties
それを避けるには、より一意の名前を付ける必要があります。私の最初のメソッドには、コンストラクターの偽の半分がクラスにちなんで一意に名前が付けられているため、この問題はありません。