物件導向概念

OOP 能吃嗎?

C 語言程式設計是以函數 (Function) 為單元的結構化程式設計, C++ 語言程式設計則是以類別 (Class)為單元的物件導向程式設計。
-- C++ 全方位學習,古頤榛
物件導向程式設計 (Object-Oriented Programming, OOP) 是使用類別物件為主的程式設計。類別觀念是由結構衍生而來。
類別可以包含資料變數與處理資料的函數:
  • 資料成員: 我是類別中的資料!
  • 成員函數: 我是類別中的函式!
對於沒有本科經驗的人來說,物件導向一直是個謎一樣的存在。
我依稀記得,在去年的 JSDC Workshop 的某個議程中,講者保哥提到了物件導向並且問了在座的各位有沒有聽過。
令人驚訝的是!還真的有很多人不知道 XDD
所以各位讀者如果學會了,說不定就能成為前10%的開發者喔
我自己對物件導向程式設計的見解是:
一種設計思維,利用該思維實作出一個物體的抽象概念。
-- 帥氣的我。
公X小,如果以螃蟹機器人作為舉例,機器人完成組裝的那一刻有什麼是確定的呢?
大概有:
  • 資訊
    • 製造商
    • 型號
    • 序列號碼
    • 諸如此類...
  • 行為、行為所需的參數
    • 電量
    • 向右移
    • 向左移
    • 諸如此類...
以物件導向下去實作的話,大概會長這樣:
class tableTopRobot {
constructor(data){
let {sN, vendor, material, power} = data;
this.sN = sN;
// ...
}
moveToRight(){
// ...
}
moveToLeft(){
// ...
}
}
let data = {
sN: '2030',
vendor: 'ianToy',
// ...
}
let peter = new tableTopRobot(data);
我們利用資料成員以及成員函數詳細的定義螃蟹機器人的各項細節,包含它要如何行走、電量、生產細節...等資訊。
此外,物件導向也包含了繼承的概念:
class people {
public name: string;
constructor(name:string){
this.name = name;
}
sayHi(){
return `Hello! My name is ${this.name}`;
}
}
class superHero extends people {
public birthday: number;
constructor(name: string, birthday: number){
super(name);
this.birthday = birthday;
}
tellMeBirthday(){
return `${this.birthday}`
}
}
let peter = new superHero('Peter',19990119);
console.log(peter.tellMeBirthday())
上面的程式是使用 TypeScirpt 撰寫,我們可以在範例中觀察到 superHero 類別繼承了 people 類別的特性。
這邊只是先讓讀者對物件導向有粗淺的了解,詳細的實作方面會用多篇文章細談。

至於 JavaScript 呢?

早期, JavaScript 是不支援物件導向的,它更傾向函式語言程式設計。
幸好,在廣大的開發者社群的努力下, JavaScript 終於在 ES6(2015) 正式的支援物件導向程式設計。
我們在更仔細的回想上一小節提到的:
類別可以包含資料變數與處理資料的函數。
有經驗的開發者可能就會問: 阿物件不是也可以嗎!
沒錯,其實 JavaScript 的 Class 就是物件的語法糖。
JS ES5:
function Point(x, y) {
this.x = x;
this.y = y;
}
Point.prototype.toString = function () {
return '(' + this.x + ', ' + this.y + ')';
};
var p = new Point(1, 2);
JS ES6:
class Point {
constructor(x, y) {
this.x = x;
this.y = y;
}
toString() {
return '(' + this.x + ', ' + this.y + ')';
}
}
JS 提供了一個讓人勉強接受的 Class ,好消息是: TypeScript 當然針對這點做出了全面的加強,詳細的用法筆者會在後面幾個篇章向大家好好介紹。

原型鏈

JS 是一門奇怪的語言,你如果不知道原型鏈是什麼也能寫出程式碼,
但筆者認為,如果知道這個概念對於讀者會更好。
請先參考本日的延伸閱讀。

延伸閱讀

同樣的事情在不同人眼中可能會有不同的見解、看法。
在讀完本篇以後,筆者也強烈建議大家去看看以下文章,或許會對型別、變數宣告...等觀念有更深層的看法唷!