※ 物件導向程式設計-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
查看全部
avatar-img
發表第一個留言支持創作者!
※ class類別 什麼是class? class是創造consturctor function時的語法糖,本質上與使用function創造物件(object)的行為沒有不同。 class的作用: 用來定義、描述要創造的物件(object)具有那些屬性、行為的一個表達式。就像是「車子的設計圖
※ 模板字串(template literal): 使用「``」作為語法,作為字串拼接。 呈現多行內容。 const multiLineString = `This is a string that spans multiple lines.` console.log(multiLineStr
※ ES6 變數宣告介紹: 在ES6中,推薦使用let和const取代原有的var來宣告變數。 ※ var的特點: 勢力範圍(scope)只有兩種:function、global(全域部分)。 勢力範圍(scope)指的是宣告變數的範圍,能夠被有效的使用的範圍。 可以在宣告變數之前就使用。
※ Object(物件) & Constructor Function(建構式函式) Object(物件)是什麼? 物件是一種「可以將資料、程式碼包含在其中」的資料結構。 Object(物件)的兩種創造方式: 匿名物件:直接使用"{}"。沒有特別的名字,直接從Object中繼承過來的一個物件
※ OPP(Object-oriented programming)簡介 什麼是OPP? OPP是一種軟體開發的風格方式。 是一種撰寫程式時的思考模式。 OPP的目的: 企圖將電腦世界的資料類比到現實中「物件」的概念。 將函數化的資料處理方式用類比到現實世界的互動關係,來簡化思考的難度。
※ 需要做版本備份時: git init:初始化此資料夾,由git 開始追蹤版本控制。 git add:將檔案加入到暫存區。 git commit:把暫存區的內容提交到儲存庫。 git status:查看目前所有檔案的狀態。 git log:查看過去所有commit的記錄。 ※ 需要做修
※ class類別 什麼是class? class是創造consturctor function時的語法糖,本質上與使用function創造物件(object)的行為沒有不同。 class的作用: 用來定義、描述要創造的物件(object)具有那些屬性、行為的一個表達式。就像是「車子的設計圖
※ 模板字串(template literal): 使用「``」作為語法,作為字串拼接。 呈現多行內容。 const multiLineString = `This is a string that spans multiple lines.` console.log(multiLineStr
※ ES6 變數宣告介紹: 在ES6中,推薦使用let和const取代原有的var來宣告變數。 ※ var的特點: 勢力範圍(scope)只有兩種:function、global(全域部分)。 勢力範圍(scope)指的是宣告變數的範圍,能夠被有效的使用的範圍。 可以在宣告變數之前就使用。
※ Object(物件) & Constructor Function(建構式函式) Object(物件)是什麼? 物件是一種「可以將資料、程式碼包含在其中」的資料結構。 Object(物件)的兩種創造方式: 匿名物件:直接使用"{}"。沒有特別的名字,直接從Object中繼承過來的一個物件
※ OPP(Object-oriented programming)簡介 什麼是OPP? OPP是一種軟體開發的風格方式。 是一種撰寫程式時的思考模式。 OPP的目的: 企圖將電腦世界的資料類比到現實中「物件」的概念。 將函數化的資料處理方式用類比到現實世界的互動關係,來簡化思考的難度。
※ 需要做版本備份時: git init:初始化此資料夾,由git 開始追蹤版本控制。 git add:將檔案加入到暫存區。 git commit:把暫存區的內容提交到儲存庫。 git status:查看目前所有檔案的狀態。 git log:查看過去所有commit的記錄。 ※ 需要做修
你可能也想看
Google News 追蹤
Thumbnail
隨著理財資訊的普及,越來越多台灣人不再將資產侷限於台股,而是將視野拓展到國際市場。特別是美國市場,其豐富的理財選擇,讓不少人開始思考將資金配置於海外市場的可能性。 然而,要參與美國市場並不只是盲目跟隨標的這麼簡單,而是需要策略和方式,尤其對新手而言,除了選股以外還會遇到語言、開戶流程、Ap
Thumbnail
嘿,大家新年快樂~ 新年大家都在做什麼呢? 跨年夜的我趕工製作某個外包設計案,在工作告一段落時趕上倒數。 然後和兩個小孩過了一個忙亂的元旦。在深夜時刻,看到朋友傳來的解籤網站,興致勃勃熬夜體驗了一下,覺得非常好玩,或許有人玩過了,但還是想寫上來分享紀錄一下~
Thumbnail
這一章節旨在介紹 PHP 中的物件導向編程(OOP)概念。通過詳細講解類別、建構子、訪問修飾符(公開、私有、受保護)、繼承、多型、封裝、介面、抽象類別、靜態類別、列舉、委派、Lambda 表達式、泛型和反射等概念,使讀者能夠理解和應用這些 OOP 技術來編寫更具結構性和可維護性的 PHP 代碼。
Thumbnail
這篇文章介紹了面試時以及開始工作後可能會遇到的問題,包括物件導向OOP、SOLID 設計原則、測試方式,以及 Cookie、Session 與 Cache 的相似處與不同處。提供了豐富的相關資訊。
Thumbnail
本章節的目的是讓讀者瞭解C#的物件導向特性,包括類別、繼承、多型、封裝等基本概念,以及介面、抽象類別、靜態類別等進階主題。此外,本章節也將介紹如何使用列舉、委派、Lambda表達式、泛型及反射,這些都是C#中常見的強大功能。
Thumbnail
本書大多數的內容都以 OO 的概念出發,詳列了許多設計的臭味道,也有大量的例子。個人雖然不會這樣寫程式,但仍是覺得受益良多,至少在 code review 時能更清楚知道該怎麼描述問題。不過,即便不是用 OO 的概念,有些章節還是可以帶來一些想法,用 OO 概念寫程式的人更不該錯過這本好書。
Thumbnail
代理模式通過封裝原始對象來實現對該對象的控制和管理,同時不改變原始對象的行為或客戶端與該對象互動的方式,以此介入或增強對該對象的訪問和操作。
Thumbnail
在物件導向程式設計的進階階段,學生將學習繼承、介面、抽象類別等核心概念。繼承允許類別共享屬性和方法,介面確保實現類別提供特定的方法實現,而抽象類別定義了基本結構供子類別擴展。這些知識點有助於提升程式碼的重用性、擴展性和維護性。
Thumbnail
本階段深掘PHP中類別與物件的應用,從基本定義到屬性與方法的運用,並特別著重於訪問控制和靜態成員的概念。學生將學會如何有效地利用公開、保護、私有屬性,以及如何在不實例化的情況下透過類別名稱直接訪問靜態屬性和方法,進一步鞏固物件導向程式設計的核心知識。
Thumbnail
本階段介紹物件導向程式設計(OOP)基礎,從OOP概念、類別與物件基本原理,到PHP中類別與物件的應用,並深入探討封裝、繼承等OOP特性,最後以實際練習加強理解。此階段為學生掌握PHP OOP打下堅實基礎。
物件導向設計的一個重點就是封裝,這有很多層面上的意義,但基本上就是控制物件的成員變數和方法的存取權。物件導向的封裝還跟繼承機制有關,這使得有一些時候我們逼不得已必須把函式定義在類別上,這種做法使得物件的功能變得難以拆解。封裝應該是模組的職責,並不需要再給物件相同的能力。 一般的模組系統就是把相
Thumbnail
題目敘述 題目會給我們一組定義好的界面和需求,要求我們設計一個資料結構,可以滿足平均O(1)的插入元素、刪除元素、隨機取得元素的操作。 RandomizedSet() 類別建構子 bool insert(int val) 插入元素的function界面 bool remove(int val
Thumbnail
隨著理財資訊的普及,越來越多台灣人不再將資產侷限於台股,而是將視野拓展到國際市場。特別是美國市場,其豐富的理財選擇,讓不少人開始思考將資金配置於海外市場的可能性。 然而,要參與美國市場並不只是盲目跟隨標的這麼簡單,而是需要策略和方式,尤其對新手而言,除了選股以外還會遇到語言、開戶流程、Ap
Thumbnail
嘿,大家新年快樂~ 新年大家都在做什麼呢? 跨年夜的我趕工製作某個外包設計案,在工作告一段落時趕上倒數。 然後和兩個小孩過了一個忙亂的元旦。在深夜時刻,看到朋友傳來的解籤網站,興致勃勃熬夜體驗了一下,覺得非常好玩,或許有人玩過了,但還是想寫上來分享紀錄一下~
Thumbnail
這一章節旨在介紹 PHP 中的物件導向編程(OOP)概念。通過詳細講解類別、建構子、訪問修飾符(公開、私有、受保護)、繼承、多型、封裝、介面、抽象類別、靜態類別、列舉、委派、Lambda 表達式、泛型和反射等概念,使讀者能夠理解和應用這些 OOP 技術來編寫更具結構性和可維護性的 PHP 代碼。
Thumbnail
這篇文章介紹了面試時以及開始工作後可能會遇到的問題,包括物件導向OOP、SOLID 設計原則、測試方式,以及 Cookie、Session 與 Cache 的相似處與不同處。提供了豐富的相關資訊。
Thumbnail
本章節的目的是讓讀者瞭解C#的物件導向特性,包括類別、繼承、多型、封裝等基本概念,以及介面、抽象類別、靜態類別等進階主題。此外,本章節也將介紹如何使用列舉、委派、Lambda表達式、泛型及反射,這些都是C#中常見的強大功能。
Thumbnail
本書大多數的內容都以 OO 的概念出發,詳列了許多設計的臭味道,也有大量的例子。個人雖然不會這樣寫程式,但仍是覺得受益良多,至少在 code review 時能更清楚知道該怎麼描述問題。不過,即便不是用 OO 的概念,有些章節還是可以帶來一些想法,用 OO 概念寫程式的人更不該錯過這本好書。
Thumbnail
代理模式通過封裝原始對象來實現對該對象的控制和管理,同時不改變原始對象的行為或客戶端與該對象互動的方式,以此介入或增強對該對象的訪問和操作。
Thumbnail
在物件導向程式設計的進階階段,學生將學習繼承、介面、抽象類別等核心概念。繼承允許類別共享屬性和方法,介面確保實現類別提供特定的方法實現,而抽象類別定義了基本結構供子類別擴展。這些知識點有助於提升程式碼的重用性、擴展性和維護性。
Thumbnail
本階段深掘PHP中類別與物件的應用,從基本定義到屬性與方法的運用,並特別著重於訪問控制和靜態成員的概念。學生將學會如何有效地利用公開、保護、私有屬性,以及如何在不實例化的情況下透過類別名稱直接訪問靜態屬性和方法,進一步鞏固物件導向程式設計的核心知識。
Thumbnail
本階段介紹物件導向程式設計(OOP)基礎,從OOP概念、類別與物件基本原理,到PHP中類別與物件的應用,並深入探討封裝、繼承等OOP特性,最後以實際練習加強理解。此階段為學生掌握PHP OOP打下堅實基礎。
物件導向設計的一個重點就是封裝,這有很多層面上的意義,但基本上就是控制物件的成員變數和方法的存取權。物件導向的封裝還跟繼承機制有關,這使得有一些時候我們逼不得已必須把函式定義在類別上,這種做法使得物件的功能變得難以拆解。封裝應該是模組的職責,並不需要再給物件相同的能力。 一般的模組系統就是把相
Thumbnail
題目敘述 題目會給我們一組定義好的界面和需求,要求我們設計一個資料結構,可以滿足平均O(1)的插入元素、刪除元素、隨機取得元素的操作。 RandomizedSet() 類別建構子 bool insert(int val) 插入元素的function界面 bool remove(int val