javascriptにはコンストラクタ関数とファクトリ関数という関数が存在します。
この2つは役割が非常に似ているため、混同しやすいので、自分への備忘録も兼ねて、例文コードと共に、違いを紹介します!
ファクトリ関数
ファクトリ関数とは、「1つのオブジェクトを返す関数」のことを言います。
1 2 3 4 5 6 7 8 9 10 11 |
function makeCar(color = 'red') { return { color, drive() { console.log('drive!'); } } } const factoryCar = makeCar("yellow"); console.log(factoryCar.color) // yellow factoryCar.drive() // drive! |
このように、returnで必要な情報がすべて入ったObjectを返却する関数です。
ファクトリ関数はキャメルケース
1つのObjectを返す関数という約束の他に、ファクトリ関数を宣言するときは、キャメルケースで宣言することが一般的です。
コンストラクト関数
コンストラクト関数とは、実際にその関数を使うときに、
「new 関数名」
という形で、関数をインスタンス化しないといけない関数です。
「new 関数名」と記述して、関数をインスタンス化して使用する点が、他の言語のClassに似ているので、prototype拡張を利用して、クラスのように使われることが多いです。
1 2 3 4 5 6 7 8 9 |
function Car(color = 'red') { this.color = color; this.drive = function() { console.log('drive!'); } } const constructorCar = new Car("yellow"); console.log(constructorCar.color) // yellow constructorCar.drive() // drive! |
コンストラクタ関数はアッパーキャメルケース
コンストラクタ関数はClassのように使われることが多いことから、一般的には、アッパーキャメルケースで宣言します。
Babelを使えば、Classが使えるが、古いProjectにアサインされる可能性もある
Babelを使えば、最新のjavascriptを古いブラウザでも読み取れるようにコンパイルしてくれるので、Classが使えるようになり、ファクトリ関数もコンストラクタ関数も共に使用せずに安全で拡張性の高いプログラムを書くことが可能になります。
しかし、昔から続くプロジェクトにアサインされた場合、ファクトリ関数やコンストラクタ関数が使われている可能性が非常に高いです。
実際、多くのOSSライブラリはコンストラクタ関数が使われています。
どのような現場でも、パフォーマンスが発揮できるように、コンストラクタ関数もファクトリ関数も覚えておいて損はないでしょう!