◆ class のプロパティ定義は引数を受け取れない
◆ constructor が必要になる
◆ class 自体が constructor として引数を受け取って欲しい
◆ それって function でよくない?

ちょっと前にクラス構文でプロパティが constructor の外で直接書けるようになりました
こういう感じです

new class {
a = 1
b = 2
c = this.a + this.b
}

これに 「a は引数でデフォルト値を設定したい」となったとしましょう
この構文では引数を受け取れないので constructor が必要になります

new class {
constructor(value) {
this.a = value || 1
this.c = this.a + this.b
}

b = 2
c2 = this.a + this.b
}
// c2 is NaN

constructor がある場合 constructor はプロパティ定義との位置(上下)は関係なくプロパティ定義の後で実行されます
そのため this.c には 1 + 2 の 3 が入っていますが
constructor の外側に書いた this.c2 のほうは計算時に this.a が未設定なので NaN となります

全てのプロパティ定義を constructor の外に書けるなら見やすいとも言えますが 混ざってくるとわかりづらくなってきます
constructor 外のプロパティ定義を積極的に使うなら 理想は constructor 外で引数を扱えるというものです

new class(value) {
a = value || 1
b = 2
c = this.a + this.b
}

実行すると構文エラーになりますが こういうふうに class 自体に引数を書けて constructor 不要となってほしいものです
でも この見た目 どこかで見覚えないでしょうか

そう class を function にすればいいのです

new function(value) {
this.a = value || 1
this.b = 2
this.c = this.a + this.b
}

こうすればちゃんと動く JavaScript 構文になります
これは class 構文ができる前からの JavaScript の構文です
一周回ってクラス構文いらなくない?ってなりましたね

注意

完全に class 構文がいらなくなるかというと そうでもなく注意すべき違いもあります

まず 見ての通り function にすると a や b にも this. プレフィックスが必要になります
個人的には 面倒はあるものの参照するときには this. プレフィックスが必要なので揃ってるという意味ではこっちでもいいと思います

また メソッド定義でクラス構文のメソッド記法は使えなくなります
代わりにアロー関数を代入する形になりますが そのほうが this が固定されるので扱いやすいとも言えます
固定したくないなら function 式で作って代入することもできます

あとは アロー関数でも通常の関数でも プロトタイプを使わずインスタンス自体にメソッドが設定されるという部分です
こういう作りのライブラリも多くありますし インスタンスは少ししか作らないなら問題ないです
しかし 何千何万とかいうレベルでインスタンスを作ると差は出てきてしまうので 使用用途によってはプロトタイプを使ったほうが良いです