クラスか関数か はコレ⇩

// class
class Foo {
constructor(value) {
this.value = value
}
bar() { return this.value + 1 }
baz() { return 0 }
}
const a = new Foo(100)
a.bar()


// function
const foo = value => {
return {
bar() { return value + 1 },
baz() { return 0 },
}
}
const b = foo(100)
b.bar()

簡単に違いをまとめると

パフォーマンスはクラスのほうが prototype にまとまるので上
クラスだと最近のプライベートプロパティ機能を使わなければデータは全部見えてる
関数のほうだと return オブジェクトに含まなければ見えない

require の視点でみると関数のほうが楽

// function
const module1 = require("module")(options)

// class
const module2 = new (require("module"))(options)

new が必要なのでカッコが追加で必要になる
カッコいれないと require 自体を new することになる
いったん変数に入れてもいい

const Module = require("module")
const module3 = new Module(options)

node_modules では一旦変数に入れず require と同時にオプションを入れてインスタンスを作ってるものも多い
モジュールのインスタンスをモジュール名にしたいときはコンストラクタの名前に迷うし

でも import になると 式じゃないので取得してそのまま呼び出せない

import Module from "module"
const module4 = new Module(options)

require からの書きやすさ的な関数のメリットはなくなるし クラス構文の流行りもあって今後は new が必要なのが増えるのかも