# [JavaScript] 建構子 / 工廠函式(factory function)創造物件?
###### tags: `前端筆記`
## 只是粗略談
1. 建構子是以 `prototype` 將自己的東西丟給物件「繼承」,除非物件自己改寫,要不然物件本身沒有繼承來的東西(在 `prototype` 裡面)
2. 工廠函式(factory function)則是以閉包(closure)為基準,不過創造出來的物件自己「都會有全部的東西」
### 工廠函式(factory function)
```javascript=
// 用閉包的觀念使用 Factory Function 建立物件
// 但是就會變成每個物件都有「自己的」方法,而不是「繼承」
// 但好處就是不用管 this 跟 prototype chain
const Person = (name) => {
const sayName = () => console.log(`my name is ${name}`)
return {sayName}
};
const Nerd = (name) => {
// simply create a person and pull out the sayName function with destructuring assignment syntax!
// 因為回傳的是物件方法,所以在變數那邊用 {} 讓其退回成「函式」
const {sayName} = Person(name)
const doSomethingNerdy = () => console.log('nerd stuff')
return {sayName, doSomethingNerdy}
};
const jeff = Nerd('jeff');
jeff.sayName(); //my name is jeff
jeff.doSomethingNerdy(); // nerd stuff
```

### 建構子
```javascript=
也可以用一開始的建構子,但這樣子就要記得 this 的處理
function Person (name) {
this.name = name;
}
Person.prototype.sayName = function () {
console.log(`My name is ${this.name}`);
};
Person.prototype.doSomethingNerdy = function () {
console.log('nerd stuff');
};
const jeff = new Person('jeff');
jeff.doSomethingNerdy(); // nerd stuff
```

## 推薦資源
1. [JavaScript object creation patterns tutorial - factory , constructor pattern, prototype pattern
](https://www.youtube.com/watch?v=xizFJHKHdHw&t=594s)
2. [Why use "closure"?](http://howtonode.org/why-use-closure)