# 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