※ 物件導向程式設計-OPP(六)

閱讀時間約 8 分鐘

※ OPP第一大核心-封裝

  • 封裝的精神在於將「方法」、「屬性」和「邏輯」包裝在類別裡面,透過類別的實例來實現。這樣外部物件不需要了解內部的實現細節,只需要知道如何使用該類別提供的接口即可。換句話說,封裝是將內部細節隱藏起來,只暴露必要的部分給使用者。
  • 封裝的核心概念是,使用者如果想要接觸資料,只能透過公開的方法來操作,不能直接修改內部的資料。
  • 封裝的三大好處:
  1. 保護內部的程式碼:確保使用者無法任意更改物件內部的屬性和重要資料,從而保護資料的完整性和一致性。
  2. 簡化使用:使用者只需要知道提供了什麼功能,而不需要了解其如何實作。這樣可以降低使用複雜性,讓介面更友好。
  3. 提高程式碼可維護性和安全性:封裝可以使程式碼更容易理解與維護,並且提高了程式碼的安全性,因為內部實現細節被隱藏,減少了錯誤和漏洞的風險。

※ 封裝-例子

class Dog {
constructor(name, color) {
this.name = name
this.color = color
//嘴
this.mouth = {
bite: function (something) {
//咬
console.log(`${something}`)
},
eat: function (something) {
//吃
console.log(`${something}`)
},
spark: function () {
//吠叫
console.log(`吠叫`)
}
}
}

spark() {
//實作細節,從喉嚨發出聲音
this.mouth.spark()
}

bite(someone) {
//實作細節,要用嘴去咬東西
const name = getName(someone)
this.mouth.bite(name)
}

eat(thing) {
const name = getName(thing)
this.mouth.eat(name)
}
}
//不想被暴露的功能
const getName = function objectOrName(thing) {
//錯誤處理
let name = ''
if (typeof thing === 'object' && thing.name)
name = thing.name
else if (typeof thing === 'string')
name = thing
else name = ''
return name
}
dog.eat(catty)//輸出 吃凱蒂

※ OPP第二大核心-繼承

  • 繼承的概念:一個類別可以通過「繼承」另一個類別來獲得其所有的「屬性」、「方法」和「邏輯」。這樣,使用者不需要重寫相同的程式碼,就能使用繼承來的「屬性」、「方法」和「邏輯」。簡單來說,繼承讓我們可以輕鬆地使用和擴展已有的功能。
raw-image
  • 繼承分為兩種:
  1. ES5的繼承:使用「Child.prototype = new Parent()」這類prototype原型鍊達到類別的繼承。
//定義父類建構函數,​它接收兩個參數 name 和 age
//函數初始化了三個屬性:name、age 和一個方法 methodFunc
function Parent(name, age) {
this.name = name
this.age = age

this.methodFunc = function () {
console.log(name, age)

}
}
//定義子類建構函數
//它接收一個參數 price,並將其賦值給 this.price。
function Child(price) {
this.price = price
}
//設定子類的原型
//Child.prototype 現在是一個 Parent 物件。
//結果是,所有 Child 的實例都會繼承 Parent 實例的屬性和方法。
Child.prototype = new Parent("孩子", 18)
//創建 Child 的實例
const c = new Child (4000)
//輸出結果
c.price //輸出4000

c.age //輸出18

c.methodFunc() //輸出孩子 18
  1. ES6的繼承:
  • 使用「extends」作為繼承關鍵字。
  • 使用「super」呼叫父類別的constructor進行初始化。
  • super 關鍵字有一些特殊的規則和限制:
  1. 位置:super() 必須在 constructor 中的第一個語句。因為 super() 是用來初始化父類的建構函數。
  2. this 的使用:this 關鍵字的任何使用必須在 super() 之後。因為在 JavaScript 中,只有在父類構造完成後,子類的實例才被認為是完整的,才能正常使用 this。
  3. 限制:super() 只能在 constructor 中調用。但可以使用 super.methodName() 來調用父類的方法。
  • super()有兩個用法:
  1. 調用父類的建構函數:

使用 super 調用父類的建構函數是為了在子類中正確地初始化從父類繼承過來的屬性和行為。

class Parent {
constructor(name, age) {
this.name = name;
this.age = age;
}
}

class Child extends Parent {
constructor(price, name, age) {
super(name, age); // 調用 Parent 的建構函數,初始化 name 和 age
this.price = price; // 初始化 Child 自己的屬性
}
}

const c = new Child(4000, "孩子", 18);
console.log(c.name); // 輸出:孩子
console.log(c.age); // 輸出:18
console.log(c.price); // 輸出:4000
  1. 調用父類的方法:

當重寫父類的方法時,可以在子類中調用父類的方法,這樣可以在增加或修改功能時,保留原本的功能。

class Parent {
constructor(name, age) {
this.name = name
this.age = age
}
methodFunc() {
console.log("這是parent", this.name, this.age)

}
static staticMethods() {
console.log("這是parent")
}
}

class Child extends Parent {
constructor(price, name, age) {
super(name, age)//代表parent的建構函數
this.price = price
}
static staticMethods() {
super.staticMethods()
console.log("這是children")
}
methodFunc() {
super.methodFunc()
console.log("這是children", this.name, this.age)

}
}

const c = new Child(4000, "孩子", 18)
c.methodFunc()//輸出這是parent 孩子 18和這是children 孩子 18


    全端網頁開發專業知識分享
    留言0
    查看全部
    發表第一個留言支持創作者!
    你可能也想看
    創作者要怎麼好好休息 + 避免工作過量?《黑貓創作報#4》午安,最近累不累? 這篇不是虛假的關心。而是《黑貓創作報》發行以來可能最重要的一篇。 是的,我們這篇講怎麼補充能量,也就是怎麼休息。
    Thumbnail
    avatar
    黑貓老師
    2024-06-29
    跟PHP一起玩轉物件導向:從玩具箱到工具箱-實戰應用進入物件導向設計的實戰階段,我們通過建立人力資源管理功能來實踐理論知識。透過這些實作練習,能夠深化對物件導向概念的理解,並學會如何在實際開發中應用這些概念。
    Thumbnail
    avatar
    Rewrite
    2024-04-13
    跟PHP一起玩轉物件導向:從玩具箱到工具箱-進階概念在物件導向程式設計的進階階段,學生將學習繼承、介面、抽象類別等核心概念。繼承允許類別共享屬性和方法,介面確保實現類別提供特定的方法實現,而抽象類別定義了基本結構供子類別擴展。這些知識點有助於提升程式碼的重用性、擴展性和維護性。
    Thumbnail
    avatar
    Rewrite
    2024-04-13
    跟PHP一起玩轉物件導向:從玩具箱到工具箱-深入類別與物件本階段深掘PHP中類別與物件的應用,從基本定義到屬性與方法的運用,並特別著重於訪問控制和靜態成員的概念。學生將學會如何有效地利用公開、保護、私有屬性,以及如何在不實例化的情況下透過類別名稱直接訪問靜態屬性和方法,進一步鞏固物件導向程式設計的核心知識。
    Thumbnail
    avatar
    Rewrite
    2024-04-13
    邁向熟手之路 - 物件導向程式設計經過這麼多年的觀察與實踐,一個成熟的軟體工程師還需要第四個要素,它是讓決定你通往熟手的重要關鍵沒有之一。
    Thumbnail
    avatar
    Warren Lo
    2024-04-08
    Python 程式札記 : 物件導向的基本概念物件導向(OOP),不僅提供了更結構化的程式碼組織方式,還有助於提高程式碼的可讀性、可重用性和可維護性。本文將介紹物件導向概念中的類別、對象、繼承、封裝和多型,並透過具體範例來展示這些概念如何在實際編程中應用。
    Thumbnail
    avatar
    梧笙
    2023-12-06
    程式本科系學了什麼(三) - 物件導向等基本功上一集有說,我們以前在學校要教很多作業,扣除那一些夭壽難的題目,其實大多數都是在練基本功 而外面許多書籍、課程和公司內的學習,則是強調實用和解決問題的方法 例如如何寫一個爬蟲程式、如何寫一個影像處理的程式、如何做使用者界面
    avatar
    如峰小教室
    2022-10-29
    不間斷 Python 挑戰 Day 23 - 物件導向程式設計:繼承 (Inheritance)「繼承」顧名思義就是有一個或多個類別延續了某個類別的特性,就如同在人類社會裡,兒女接收了父母的財產、承襲了上代的技能、延續了前一輩的事業。在Python的語言裡,能夠繼承的特性為類別的屬性與方法,繼承的類別稱為子類別(child class / subclass)或衍伸類別(derived clas
    Thumbnail
    avatar
    Wei-Jie Weng
    2022-01-29
    不間斷 Python 挑戰 Day 22 - 物件導向程式設計:封裝 (Encapsulation)在類別一節中,我們可以用Student類別的實體來存取類別中的name變數、score字典、以及其中的所有方法,這些可以被類別以外的程式碼所直接存取的屬性稱為公有屬性(public attribute)、可以被類別以外的程式碼所直接呼叫的方法稱為公有方法(public method)。
    Thumbnail
    avatar
    Wei-Jie Weng
    2022-01-22
    不間斷 Python 挑戰 Day 19 - 物件導向程式設計:類別 到目前為止,我們所學習的都是程序性的程式設計(procedural programming),也就是程式碼是透過一連串的指令組成的程序或函數,由上而下依序執行不同的程序或是呼叫函數來完成程式的功能。 Python其實是一種物件導向的程式(object oriented programming, 簡稱
    Thumbnail
    avatar
    Wei-Jie Weng
    2022-01-06
    程式概念 - python物件導向物件導向的概念,以python程式為範例。
    Thumbnail
    avatar
    薰魚
    2021-09-12