skip to content

Factory Function

Factory function vs class

前言

Factory function 是 用來產生 object 的 function ,這篇文章拿 Factory function 與 class 做比較。 以下先看看 Class 的實例。

Class

class Dog {
	constructor() {
		this.sound = "woof";
	}
	talk() {
		console.log(this.sound);
	}
}

const sniffles = new Dog();
sniffles.talk(); // Outputs: "woof"

一切看起來沒問題,是吧?

但此時如果新增了一個按鈕來啟動讓 sniffles 啟動呢?

$("button.myButton").click(sniffles.talk);

上面的 this 不會指向 sniffles,因此必須要另外綁定才行

$("button.myButton").click(sniffles.talk.bind(sniffles));

或是寫成這樣

${'button.myButton'}.click( _ => siffles.talk())

作者認為 new 跟 this 在 JS 裡面是很不直觀的,而你可以這樣寫。

Factory Function

const dog = () => {
	const sound = "woof";
	return {
		talk: () => console.log(sound),
	};
};
const sniffles = dog();
sniffles.talk(); // Outputs : "woof"

看起來是不是乾淨許多呢? 請注意,這邊有運用到閉包的概念(closure),因為有了閉包,talk 在運行的時候才有辦法知道 sound 是什麼。

${'button.myButton'}.click(sniffles.talk)

event 的部分可以這樣寫。

總結

以 factory function 取代 class 可以讓你的程式碼更簡單,更乾淨,也更易讀。

參考:Factory function in JavaScript