物件導向是一種開發程式的方法,就字面的意思是以物件為中心,把數據資料(property)與其相對應的操作(method)包在一起,來模擬現實世界實體和其相互作用。
所謂的模擬,是將現實世界中的實體(如人、車、動物、書等)抽象成物件的形式,每個物件具有屬性(描述物件特徵的數據)和方法(描述物件行為的函數)。這樣的抽象允許開發者在程式中能更自然地表示和處理這些概念。一旦物件被創建,開發者可以使用方法來操作物件的狀態和行為。這包括讀取或修改物件的屬性,以及調用物件的方法來執行特定操作。
OOP引進了藍圖的概念,像是有一張房子的設計圖(class),照著作就可以蓋出許多實體的房子(instance)
如果要做客變,可以參照原本的藍圖,再畫一張加上設計變更的藍圖(inheritance)
Abstration:將複雜的現實世界問題簡化為程式可以處理的模型,隱藏不必要的細節,聚焦於重要的特徵,以便更有效地設計和撰寫程式碼。
Encapsulation:屬性與方法的私有化,限制外部存取和修改這些數據,只允許通過公有方法來存取或操作。能避免外部程式與物件內的東西有交互作用,改了這個,影響了那個,牽一髮而動全身會很麻煩,有助於維護程式碼的完整性、提高安全性。
例子:
物件:銀行帳戶
私有屬性:帳戶餘額
公有方法:存款 & 提款
外部的人無法直接得知帳戶餘額,只能通過提款或存款的動作進行操作,
才能知道餘額。這樣可以確保帳戶餘額的安全性和一致性。
例子:
parent class: 正方形
內有長,寬,顏色等屬性;還有計算面積的方法
child class: 長方形
由parent class繼承了裡面的屬性&方法
例子:
parent class: 正方形
內有長,寬,顏色等屬性;還有計算面積的方法
child class: 圓形
由parent class繼承了裡面的屬性&方法,
但可以改寫屬性(邊長改半徑)及方法的內容(以符合圓形的面積計算方式)
有學過其他語言再來碰js的人,都會說js"很奇怪",其中一個點是,js的OOP根本就不是OOP。js並沒有傳統OOP的class,而是以prototype取代類似的概念,物件之間的繼承,以prototypal inheritance(or delegation)實現
prototype裡的方法,只有與prototype有"連結"的物件能使用,
連結指的是prototype chain,使用則是一種類似繼承的概念。
不管用的名稱是什麼,它的機制跟class之間的繼承是不同的,要說的話,應該更接近class與instance的關係,由prototype衍生出來的物件,可以使用prototype裡的方法。
像是我們時常使用的array method,其實是將Array這個建構函式作為prototype,而藉由它們之間有所連結的原因來取用Array裡的方法。
const arr = new Array();
console.log(arr);
自己在學js的oop時,對這幾個原則比較印象深刻的是封裝,特別地不上手,像是getter和setter的使用,後面也有規劃一些篇幅來整理自己的想法,希望能順利跨過這個檻。
udemy-The Complete Javascript Course