---
# System prepended metadata

title: PixiJS 切換場景（1）Factory Function
tags: [PixiJS]

---

# PixiJS 切換場景（1）Factory Function
###### tags: `PixiJS`
2022.10.19(Wed.)

## ▉ Introduction
為了學習切換場景，所以先看了[奔跑吧！台北：程式幕後分享](https://medium.com/@chiunhau/%E5%A5%94%E8%B7%91%E5%90%A7-%E5%8F%B0%E5%8C%97-%E7%A8%8B%E5%BC%8F%E5%B9%95%E5%BE%8C%E5%88%86%E4%BA%AB-e02d0a565559)的文章，裡面提到了一篇文章「[Tutorial : Handling game scenes and screen scaling with Pixi](http://ezelia.com/2013/pixi-tutorial)」，然後打開來後發現...我在看的程式碼語言是JavaScript嗎？（完全看不懂QQ）

### Keywords
整理一些從[Tutorial : Handling game scenes and screen scaling with Pixi](http://ezelia.com/2013/pixi-tutorial)中看見的Keywords：
module, export, class, constructer, super, extends

不過在學習上述關鍵字的路上，碰到了更多的關鍵字...所以決定乘著這個機會，一步步的把他補齊。

****

## ▉ Factory Function
不過在學習上述關鍵字的路上，就碰到了這個專有名詞「Factory Function」。

越看越熟悉，這才發現不就是之前PIXIJS教程中提供的Treasure Hunter Game裡`keyboard（）` 這個自定義函數裡面的寫法嗎！原來他是有專有名詞的。

來回顧一下當時的程式碼：
```javascript!
function keyboard(keyCode){
    var key = {};
    key.code = keyCode;
    key.isDown = false;
    key.isUp = true;
    key.press = undefined;
    key.release = undefined;
    key.downHandler = function(event){
        if(event.keyCode === key.code){
            if(key.isUp && key.press)key.press();
            key.isDown = true;
            key.isUp = false;
        }
        event.preventDefault();
    }
    key.upHandler = function(event){
        if(event.keyCode === key.code){
            if(key.isDown && key.release)key.release;
            key.isDown = false;
            key.isUp = true;
        }
        event.preventDefault();
    }
    
    window.addEventListener(
        "keydown", key.downHandler.bind(key), false
    );
    window.addEventListener(
        "keyup", key.upHandler.bind(key), false
    );
    
    return key;
}
```

＊＊＊

所以說，什麼是Factory Function呢？

> 以下將從[What is Factory Function in JavaScript? - JS Tutorial](https://www.youtube.com/watch?v=lE_79wkP-1U)這個yt影片以及[The Web Developer Bootcamp 2022](https://www.udemy.com/course/the-web-developer-bootcamp/) U29整理出一些重點出來。

先用一句話概括他：「Factory Function is just a function that create objects and returns them.」也就是在函式中創造物件後，回傳這個物件，簡單來看就是如下程式碼。

```javascript!
function factory(){
    return {...}
}
```

這時可能會有些疑問，為什麼不能直接創造物件就好了呢？如下方所示，不是更加簡單明瞭嗎？
```javascript!
const object = {...}
```

當然也是可以的！但是如果你需要多個物件，例如說：
```javascript!
const Sam = {
    name: "Sam",
    talk(){
        return "hello I am ${this.name}"
    }
}
const Sean = {
    name: "Sean",
    talk(){
        return "hello I am ${this.name}"
    }
}
```
可能會想說不就多複製貼上幾次就好了嗎？但是當一樣的程式碼寫了兩遍以上，若未來出現了bug，或者哪裡需要修正，就得更正多次（而且更正的東西還是一模一樣的）。

一般來說，我們只希望相同的邏輯出現1次就好，如此一來，有bug需要修正，也只需要1次即可。

所以現在想像有一家factory（工廠），我們把金屬、塑膠等等的原材料送進一家工廠，而工廠執行一些工作之後，就可以生產出一台車子。
![](https://i.imgur.com/yFv0thb.jpg)

現在把上面的程式碼改成利用Factory Function來完成：
```javascript!
function createPerson(name){
    var talkObject = {};
    talkObject.name = name;
    talkObject.talk = function(){
        return `hello I am ${this.name}`;
    }
    return talkObject;
}
```
這樣當我要使用這個talk()函式時，只要如下呼叫即可：
```javascript!
const Sam = createPerson("Sam");
Sam.talk(); //hello I am Sam.
```

列出一些Factory Function的優點：
1. Simple
2. No duplicates（不會重複多次）
3. Data Privacy（不能隨意更改）

****

### 參考資料
* [奔跑吧！台北：程式幕後分享](https://medium.com/@chiunhau/%E5%A5%94%E8%B7%91%E5%90%A7-%E5%8F%B0%E5%8C%97-%E7%A8%8B%E5%BC%8F%E5%B9%95%E5%BE%8C%E5%88%86%E4%BA%AB-e02d0a565559)
* [Tutorial : Handling game scenes and screen scaling with Pixi](http://ezelia.com/2013/pixi-tutorial)
* [ES6 的 Class 、super 的特例與繼承](https://ithelp.ithome.com.tw/articles/10200658)（推）
* [How to export a Class in JavaScript](https://bobbyhadz.com/blog/javascript-export-class)
* [[JS] JavaScript 模組（ES Module）](https://pjchender.dev/javascript/js-es-module/)
* [The Web Developer Bootcamp 2022](https://www.udemy.com/course/the-web-developer-bootcamp/) U29：Prototypes, classes, OOP