---
# System prepended metadata

title: PixiJS 切換場景（4）Extends、Super
tags: [PixiJS]

---

# PixiJS 切換場景（4）Extends、Super
###### tags: `PixiJS`
2022.10.25(Tue.)

## ▉ 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

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

****

## ▉ Extends
首先我們先來創建一個class名叫cat
```javascript!
class Cat{
    constructor(name, age){
        this.name = name;
        this.age = age;
    }
    eat(){
        return `${this.name} is eating.`
    }
    meow(){
        return "MEOWWWWWWWW"
    }
}
```
簡單測試一下，確認程式是沒有問題的

![](https://i.imgur.com/jDvM7Dw.png)

接著再創造一個dog的class
```javascript!
class Dog{
    constructor(name, age){
        this.name = name;
        this.age = age;
    }
    eat(){
        return `${this.name} is eating.`
    }
    bark(){
        return "WOOOOOOOOF"
    }
}
```
同樣地先確認程式碼沒有出現問題

![](https://i.imgur.com/vOSQgjZ.png)

接著我們可以來看看以上兩段cat、dog class的程式碼，會發現這兩個class好多好多重複的程式，所以我們就會思考，是不是有甚麼辦法讓重複的內容不再重複呢？

這時候extends就出現了！顧名思義，就是要延伸！因此我們可以先建立一個額外獨立的class，將重複的內容集中到這裡頭，接著其他的class就可以去extend延伸去做使用了，其實也就是所謂的「繼承」。

那做法就如上方所述，先來建立個獨立的class，這裡給他取名叫做Pet
```javascript!
class Pet{
    constructor(name, age){
        this.name = name;
        this.age = age;
    }
    eat(){
        return `${this.name} is eating.`
    }
}
```
有了這個獨立的class，接著就要讓cat、dog可以延伸去使用裡面的內容
```javascript!
class Cat extends Pet{
    meow(){
        return "MEOWWWWWWWW"
    }    
}
class Dog extends Pet{
    bark(){
        return "WOOOOOOOOF"
    }    
}
```

確認後是沒問題的
![](https://i.imgur.com/fvHp80w.png)

![](https://i.imgur.com/6h9lSRA.png)

並且即便Cat、Dog 兩個class中沒有eat() method，仍然可以從延伸處Pet class取得這個method。

![](https://i.imgur.com/gJodNet.png)

那假如在Dog class以及Pet class中同時存在相同的method，會執行哪一邊的method呢？現在來試試看！
```javascript!
class Pet{
    constructor(name, age){
        this.name = name;
        this.age = age;
    }
    eat(){
        return `${this.name} is eating.`
    }
}

class Dog extends Pet{
    bark(){
        return "WOOOOOOOOF"
    }
    eat(){
        return `${this.name} scarfs his food.`
    }    
}
```
以上方為例子，會發現在Dog class以及Pet class中同時存在eat() method，而執行下來結果顯示，當我們呼叫`milk.eat()`時，他會先在Dog prototype中確認是否有eat() method，如果有就直接執行，否則就往下到Pet prototype找eat() method，如果再找不到就會往object prototype，再找不到就...他會讓你知道找不到這個method的。

![](https://i.imgur.com/R6wiE4G.png)

## ▉ Super
先來個情境如下
```javascript!
class Pet{
    constructor(name, age){
        this.name = name;
        this.age = age;
    }
    eat(){
        return `${this.name} is eating.`
    }
}

class Cat extends Pet{
    meow(){
        return "MEOWWWWWWWW"
    }    
}
```
但是我希望在Cat中增加不一樣、額外的資訊放在constructor（i.e.我不只要name, age，我還想要有個livesleft），那該如何寫？

最簡單粗暴的想法大概就如下方所示，直接再重複寫一遍後，加上我們額外要新增的東西，反正當建立一個Cat實例時，調用其中的`this.name`，會先從Cat class開始找起。
```javascript!
class Cat extends Pet{
    constructor(name, age, livesleft=9){
        this.name = name;
        this.age = age;
        this.livesleft = livesleft;
    }
    meow(){
        return "MEOWWWWWWWW"
    }    
}
```
不過我不希望重複寫一樣的內容，畢竟這樣的話extends還有甚麼意義呢？所以這時就出現了一個語法叫做super的關鍵字！

他會去參考我們所extends的class中的基礎類別來使用，用法如下所示
```javascript!
class Cat extends Pet{
    constructor(name, age, livesleft=9){
        super(name,age);
        this.livesleft = livesleft;
    }
    meow(){
        return "MEOWWWWWWWW"
    }    
}
```

****

### 參考資料
* [奔跑吧！台北：程式幕後分享](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)
* [The Web Developer Bootcamp 2022](https://www.udemy.com/course/the-web-developer-bootcamp/) U29：Prototypes, classes, OOP