JS OOP (Prototype-based) / FP

  • ES6 後支援 class 語法
  • 本篇 JS OO 概念不涉及 ES6 新語法

1. OOP 懶人包

  • 物件導向程式設計 (Object-oriented programming, OOP)
  • 本質:
    • 是一種使用 abstraction 概念表達現實世界的程式設計方式
    • OOP 運用數個先前所建立的技術所組成,包含模組化 (modularity)、多型 (polymorphism) 以及封裝 (encapsulation)
  • 優點:
    • OOP 提出了一個更有彈性且易於維護的設計方法
    • 由於 OOP 強調模組化,因為物件導向的程式碼變得較為容易開發且易於理解
    • 廣泛被許多大型軟體工程所採用

2. JS OOP (Prototype-based)

  • JavaScript 是一個 以原型為基礎 (Prototype-based) 的程式設計語言 (或更準確的說是以原型為基礎的腳本語言)
    • 是一種不使用類別的物件導向程式設計模式
    • 使用了函數來當做類別 (Class) 的建構子 (Constructor)
    • 它採用了複製的模式而非繼承
    • 又稱作無類別 (Classless)、原型導向 (Prototype-oriented) 或以實例為基礎的程式語言 (Instance-based programming)

3. Examples

3.1. Example 1: new Function 寫法

function Car(_color){
  this.color = _color;
}
var c1 = new Car("Green");
console.log(c1);             // Car {color: "Green"}
console.log(typeof c1);      // "object"
console.log(c1.color);       // "Green"

// 以下寫法類似 new Car() 效果
var c2 = (function(){
  var _new = { constructor: Car, __proto__: Car.prototype };
  _new.constructor("Red");
  return _new;
})();
console.log(c2);             // Car {constructor: ƒ, color: "Red"}
console.log(typeof c2);      // "object"

3.2. Example 2: function.prototype 寫法

Ref:如何理解和熟练运用js中的call及apply?

function cat(){}
cat.prototype = {
    food: "fish",
    say: function(){
        console.log("I love " + this.food);
    }
}

var blackCat = new cat;    // `new cat()` work too
blackCat.say();            // "I love fish"

3.3. Example 3: 利用閉包模擬 OO 效果

Refer to: Closures (閉包) - 利用閉包模擬 OO 效果


4. FP (Functional Programming)

ref: 當 全世界的語言 都往 Functional Programming 發展 by Appletone | CodeData

4.1. 什麼是 Functional Programming

  • 一種開發典範:只需要給我處理後的結果,不需要過問結果如何而來
  • 例如:數學函式的 abs() ,回傳絕對值
  • 以前是處理數學函數計算,又以 λ 演算 (λ calculus) 為基礎
  • 如果之前沒接觸過 FP 不需太在意,有時候已經默默在用 FP 帶來的一些功能

4.2. Why Functional Programming

  • 平行化與非同步不論在任何開發上面,都是比較難處理的部分,複雜度高的邏輯,若加上 FP 的特性來處理這類複雜的問題,可以把邏輯表達的較為易懂。
  • OOP (Object-oriented programming) 教我們基本的單位就是 Class(類別),使用 Real World(真實世界)的角度去思考對應物件與方法,與 FP 所描述的方式大不相同。
  • 如果轉換到 FP,OOP 上面許多的 Design Patterns 不是特別的重要,重點放在於處理資料流上面,使得開發者更能專注問題所在。

4.3. FP Basic Functions

  • FP 有些特性我們必須熟悉,以及有一些好用的基礎函式,例如高階排序函式 (Higher-Order Functions),底下我們舉三個基本常用的函式:
    • Array.prototype.map(): 尋訪每個元素,加以處理,並且回傳處理後的元素。
    • Array.prototype.filter(): 回傳 布林值,以決定是否保留該元素。
    • Array.prototype.reduce(): 尋訪每個元素,依序組合元素,轉換成結果,丟給下個元素運算組合,然後產生最終組合的結果。

5. References

results matching ""

    No results matching ""