【前端知識】Javascript進階-類和繼承

文章目錄

    • 概述
      • 一、類(Class)
      • 二、繼承(Inheritance)
    • 三、繼承的實現方式
    • 作用
      • 一、類和作用
      • 二、繼承和作用

概述

當然可以,以下是對JavaScript中類和繼承的詳細介紹:

一、類(Class)

  1. 定義

    • 類是創建對象的模板或藍圖,它定義了對象的屬性和方法。
    • 在JavaScript中,類是通過class關鍵字定義的。
  2. 語法

    • 類的定義以class關鍵字開始,后面跟著類名。
    • 類體由一對大括號{}包圍,其中包含構造函數和方法。
  3. 構造函數

    • 構造函數是一個特殊的方法,用于在創建對象時初始化對象的屬性。
    • 構造函數在類中使用constructor關鍵字定義。
  4. 方法

    • 方法是類中的函數,用于執行特定的操作。
    • 方法定義在類體中,可以通過this關鍵字訪問對象的屬性和其他方法。
  5. 靜態方法

    • 靜態方法是屬于類本身的方法,而不是屬于類的實例。
    • 靜態方法使用static關鍵字定義,可以通過類名直接調用。
  6. 示例

class Animal {constructor(name) {this.name = name;}speak() {console.log(`${this.name} makes a sound.`);}static species() {return 'Animal';}
}const dog = new Animal('Doggy');
dog.speak(); // 輸出: Doggy makes a sound.
console.log(Animal.species()); // 輸出: Animal

二、繼承(Inheritance)

  1. 定義

    • 繼承是面向對象編程中的一個重要概念,它允許一個類(子類)繼承另一個類(父類)的屬性和方法。
    • 通過繼承,子類可以重用父類的代碼,從而實現代碼的復用和擴展。
  2. 語法

    • 在JavaScript中,子類使用extends關鍵字來繼承父類。
    • 子類可以重寫父類的方法,也可以添加新的屬性和方法。
  3. super關鍵字

    • super關鍵字用于在子類中調用父類的構造函數和方法。
    • 在子類的構造函數中,super()必須被調用,以確保父類的屬性被正確初始化。
  4. 示例

class Dog extends Animal {constructor(name, breed) {super(name); // 調用父類的構造函數this.breed = breed;}speak() {console.log(`${this.name} barks.`); // 重寫父類的方法}static species() {return 'Dog'; // 重寫父類的靜態方法}
}const myDog = new Dog('Buddy', 'Golden Retriever');
myDog.speak(); // 輸出: Buddy barks.
console.log(Dog.species()); // 輸出: Dog
  1. 繼承的優缺點
    • 優點
      • 代碼復用:通過繼承,子類可以重用父類的屬性和方法,避免重復編寫代碼。
      • 組織代碼:通過繼承,可以將相關的屬性和方法封裝在一個類中,使代碼結構更清晰。
      • 多態:子類可以重寫父類的方法,從而根據實際情況執行不同的代碼邏輯。
    • 缺點
      • 復雜性增加:隨著繼承層次的增加,代碼可能會變得更加復雜和難以維護。
      • 耦合度提高:子類與父類之間存在緊密的耦合關系,如果父類發生變化,子類也可能需要相應地進行修改。

三、繼承的實現方式

在JavaScript中,實現繼承的方式主要有以下幾種,每種方式都有其獨特的優點和缺點,并且適用于不同的場景。下面是每種繼承方式的樣例代碼:

  1. 原型鏈繼承
function Parent(name) {this.name = name;this.colors = ['red', 'blue', 'green'];
}Parent.prototype.sayName = function() {console.log(this.name);
};function Child(name, age) {// 繼承Parent的屬性和方法Parent.call(this, name); // 借用構造函數繼承屬性this.age = age;
}// 設置Child的原型為Parent的一個實例,實現原型鏈繼承方法
Child.prototype = new Parent();
Child.prototype.constructor = Child;Child.prototype.sayAge = function() {console.log(this.age);
};let child1 = new Child('Alice', 18);
let child2 = new Child('Bob', 20);child1.colors.push('black');
console.log(child1.colors); // ['red', 'blue', 'green', 'black']
console.log(child2.colors); // ['red', 'blue', 'green', 'black'] // 共享了父類實例的屬性
console.log(child1.sayName() === child2.sayName()); // true,方法也被共享

注意:上面的代碼實際上混合了原型鏈繼承和借用構造函數繼承,這不是純粹的原型鏈繼承。純粹的原型鏈繼承應該只設置子類的原型為父類的一個實例,不調用父類的構造函數。但這樣做會導致子類實例無法擁有父類構造函數中定義的屬性。為了避免這個問題,通常會結合使用借用構造函數繼承和原型鏈繼承,即組合繼承。下面的樣例將展示組合繼承。

  1. 借用構造函數繼承(也稱為偽類繼承):
function Parent(name) {this.name = name;this.colors = ['red', 'blue', 'green'];
}Parent.prototype.sayName = function() {console.log(this.name);
};function Child(name, age) {// 借用Parent的構造函數來繼承屬性Parent.call(this, name);this.age = age;
}// Child沒有繼承Parent的原型方法和屬性
let child = new Child('Alice', 18);
console.log(child.name); // Alice
console.log(child.age); // 18
// console.log(child.sayName()); // TypeError: child.sayName is not a function
  1. 組合繼承(原型鏈繼承 + 借用構造函數繼承):
function Parent(name) {this.name = name;this.colors = ['red', 'blue', 'green'];
}Parent.prototype.sayName = function() {console.log(this.name);
};function Child(name, age) {// 借用Parent的構造函數來繼承屬性Parent.call(this, name);this.age = age;
}// 原型鏈繼承Parent的方法
Child.prototype = new Parent(); // 注意:這里不會執行Parent構造函數中的代碼,只設置原型
Child.prototype.constructor = Child;Child.prototype.sayAge = function() {console.log(this.age);
};let child1 = new Child('Alice', 18);
let child2 = new Child('Bob', 20);child1.colors.push('black');
console.log(child1.colors); // ['red', 'blue', 'green', 'black']
console.log(child2.colors); // ['red', 'blue', 'green'] // 沒有共享屬性
console.log(child1.sayName() === child2.sayName()); // true,方法被共享
  1. 原型式繼承(使用Object.create):
let person = {isHuman: false,printIntroduction: function() {console.log(`My name is ${this.name}. Am I human? ${this.isHuman}`);}
};let me = Object.create(person);me.name = 'John'; // "name" 是 me 的一個屬性
me.isHuman = true; // "isHuman" 是 me 的一個屬性me.printIntroduction(); // 輸出: "My name is John. Am I human? true"
  1. 寄生組合式繼承
function Parent(name) {this.name = name;this.colors = ['red', 'blue', 'green'];
}Parent.prototype.sayName = function() {console.log(this.name);
};function Child(name, age) {Parent.call(this, name);this.age = age;
}// 創建一個父類實例的副本,并將其原型設置為父類的原型
Child.prototype = Object.create(Parent.prototype);
Child.prototype.constructor = Child;Child.prototype.sayAge = function() {console.log(this.age);
};let child1 = new Child('Alice', 18);
let child2 = new Child('Bob', 20);child1.colors.push('black');
console.log(child1.colors); // ['red', 'blue', 'green', 'black']
console.log(child2.colors); // ['red', 'blue', 'green'] // 沒有共享屬性
console.log(child1.sayName() === child2.sayName()); // true,方法被共享
  1. ES6類繼承
class Parent {constructor(name) {this.name = name;this.colors = ['red', 'blue', 'green'];}sayName() {console.log(this.name);}
}class Child extends Parent {constructor(name, age) {super(name); // 調用父類的構造函數this.age = age;}sayAge() {console.log(this.age);}
}let child1 = new Child('Alice', 18);
let child2 = new Child('Bob', 20);child1.colors.push('black');
console.log(child1.colors); // ['red', 'blue', 'green', 'black']
console.log(child2.colors); // ['red', 'blue', 'green'] // 沒有共享屬性
console.log(child1.sayName() === child2.sayName()); // true,方法被共享

請注意,上面的樣例代碼中有些包含了不必要的或錯誤的繼承方式混合(如第一個樣例中的原型鏈繼承和借用構造函數繼承的混合),僅用于說明各種繼承方式的概念和區別。在實際開發中,應該根據需要選擇最合適的繼承方式。

作用

在JavaScript中,類和繼承的作用主要體現在以下幾個方面:

一、類和作用

  1. 代碼組織

    • 類提供了一種將相關功能(屬性和方法)封裝在一起的方式,使得代碼更加模塊化和易于管理。
    • 通過類,開發者可以將復雜的邏輯分解成更小的、可復用的組件。
  2. 面向對象編程

    • 類是面向對象編程(OOP)的核心概念之一。
    • 在JavaScript中,通過類的使用,開發者可以實現封裝、繼承和多態等OOP特性。
  3. 代碼復用

    • 類允許創建多個具有相同屬性和方法的對象實例,從而實現了代碼的重用。
    • 通過定義類,開發者可以避免在每個對象中重復編寫相同的代碼。
  4. 數據隱藏

    • 類提供了一種將內部狀態(私有屬性)與外部行為(公共方法)分離的方式。
    • 通過類的封裝,開發者可以隱藏對象的內部實現細節,只暴露必要的接口給外部使用。
  5. 可讀性和維護性

    • 類使得代碼更加結構化,易于閱讀和理解。
    • 當代碼需要修改或擴展時,通過類的繼承和多態等特性,開發者可以更加容易地實現這些需求。

二、繼承和作用

  1. 代碼復用

    • 繼承允許子類重用父類的代碼,包括屬性和方法。
    • 通過繼承,子類可以繼承父類的所有功能,而無需重新編寫這些功能。
  2. 代碼擴展

    • 繼承允許子類在父類的基礎上添加新的功能或修改現有功能。
    • 通過重寫父類的方法或添加新的方法,子類可以擴展父類的功能。
  3. 多態性

    • 繼承使得子類能夠以不同的方式實現父類中的方法。
    • 通過多態性,開發者可以在不修改現有代碼的情況下,使用不同的子類來實現不同的行為。
  4. 層次結構

    • 繼承允許開發者創建具有層次結構的類體系。
    • 在這種體系中,每個類都可以被視為一個特定類型的對象,而子類則是對該類型的進一步細化或擴展。
  5. 抽象和封裝

    • 通過繼承,開發者可以將通用的功能抽象到父類中,而將特定的功能封裝到子類中。
    • 這有助于減少代碼冗余,提高代碼的可維護性和可擴展性。

在JavaScript中,類和繼承的引入使得開發者能夠以更加面向對象的方式編寫代碼,從而提高了代碼的可讀性、可維護性和可擴展性。同時,通過類的封裝和繼承等特性,開發者可以更加容易地實現代碼的重用和擴展。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/63117.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/63117.shtml
英文地址,請注明出處:http://en.pswp.cn/web/63117.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

前端搭建企業級項目的具體步驟?

?前端搭建企業級項目的具體步驟如下?: ?確定項目技術棧和規劃項目結構?:首先,確定使用的前端框架,如Vue.js,并規劃項目的目錄結構,包括src、components、routes、store等?。 ?準備開發環境?&#x…

Less和SCSS,哪個更好用?

前言 Less 和 SCSS 都是流行的 CSS 預處理器,它們的目的都是擴展 CSS 的功能,使樣式表更具組織性、可維護性和可重用性。雖然它們有許多相似之處,但在語法、特性和工作方式上也存在一些差異。 Less Less 是一種動態樣式表語言,…

【第三節】Git 基本操作指南

目錄 前言 一、獲取與創建項目 1.1 git init 1.2 git clone 二、基本快照操作 2.1 git add 2.2 git status 2.3 git diff 2.4 git commit 2.5 git reset HEAD 三、 文件管理 3.1 git rm 3.2 git mv 四、 總結 前言 本文將詳細介紹 Git 的基本操作,包括…

【Graylog】索引別名deflector的異常處理和索引分片數限制解除

索引別名deflector的異常處理 官方推薦處理步驟 Stop all Graylog nodes (OPTIONAL) If you want to keep the already ingested messages, reindex them into the Elasticsearch index with the greatest number, e. g. graylog_23 if you want to fix the deflector graylo…

PyTorch 2.0 以下版本中設置默認使用 GPU 的方法

PyTorch 2.0 以下版本中設置默認使用 GPU 的方法 在 PyTorch 2.0以下版本中,默認情況下仍然是使用 CPU 進行計算,除非明確指定使用 GPU。在 PyTorch 2.0 以下版本中,雖然沒有 torch.set_default_device 的便捷方法,但可以通過顯式…

【一本通】輸入兩個不同的數,通過指針對兩個數進行相加和相乘

【一本通】輸入兩個不同的數,通過指針對兩個數進行相加和相乘 C語言代碼C代碼Java代碼 💐The Begin💐點點關注,收藏不迷路💐 輸入兩個不同的數,通過指針對兩個數進行相加和相乘,并輸出。 輸入 …

X.game解析柚子幣提升速效雙向利好和年中歷史新低原因

柚子幣最新消息,幣安宣布將于2024年9月25日21:00左右暫停柚子幣網絡上的代幣存取業務,以全力支持即將到來的柚子幣網絡升級和硬分叉,這一消息為柚子幣的未來發展增添了新的期待和變數。 除了速度的提升,Spring1.0還帶來了諸多技術…

redis集群安裝部署 redis三主三從集群

redis集群安裝部署 redis三主三從集群 1、下載redis2、安裝redis集群 三主三從3、配置redis開機自啟動3.1、建立啟動腳本3.2、復制多份redis啟動腳本給集群使用3.3、添加可執行權限3.4、配置開機自啟動 1、下載redis 本次redis安裝部署選擇當前最新的穩定版本7.4.1 下載鏈接: …

數據結構,鏈表的簡單使用

任意位置刪除&#xff1a; void Any_Del(LinkListPtr h,int a)//任意刪 {if(NULLh||a>h->len){printf("刪除失敗");}LinkListPtr ph;for(int i0;i<a-1;i){pp->next;}LinkListPtr p2p;p2p2->next;p->nextp->next->next;free(p2);p2NULL;h-&g…

Servlet容器來掃描指定包中的類 找到帶有WebServlet注解的類

項目框架如上圖 myweb下邊三個類 package com.qcby.tomcat.myweb;import com.qcby.tomcat.webServlet.WebServlet;WebServlet(urlPatterns {"MyFirstServlet"}) public class MyFirstServlet {}package com.qcby.tomcat.myweb;import com.qcby.tomcat.webServlet.W…

clickhouse 查詢優化思路

最重要的是要學會看懂explain &#xff0c;尤其是下推創建表時&#xff0c;可以選擇表為分布式表。多個表join &#xff0c;創建表時根據join 字段,進行分片&#xff0c;讓數據在同一個節點進行join &#xff0c;提高join 效率。多個表join , 通過創建物化視圖的方式&#xff0…

兩數之和(Hash表)

優質博文&#xff1a;IT-BLOG-CN 一、題目 給定一個整數數組nums和一個整數目標值target&#xff0c;請你在該數組中找出"和"為目標值target的那兩個整數&#xff0c;并返回它們的數組下標。 你可以假設每種輸入只會對應一個答案。但是&#xff0c;數組中同一個元…

C++8--賦值運算符重載

1.運算符重載 C引入運算符的目的是為了增強代碼的可讀性。運算符重載是具有特殊函數名的函數&#xff0c;也具有其返回值類型&#xff0c;函數名字以及參數列表&#xff0c;其返回值類型與參數列表與普通的函數相似。 函數名字為&#xff1a;關鍵字operator后面接需要重載的運算…

P1255 數樓梯

剛開始使用暴力進行求解&#xff0c;結果發現這是一道考驗高精度的題目&#xff0c;后來用高精度的方法&#xff0c;甚至使用到了容器&#xff0c;結果還不如暴力求解的60分&#xff0c;后來看了題解&#xff0c;有一個非常好的思路&#xff0c;即體現了高精度求和&#xff0c;…

pyfink1.20版本下實現消費kafka中數據并實時計算

1、環境 JDK版本&#xff1a;1.8.0_412python版本&#xff1a;3.10.6apache-flink版本&#xff1a;1.20.0flink版本&#xff1a;1.20kafka版本&#xff1a;kafka_2.12-3.1.1flink-sql-connector-kafka版本&#xff1a;3.3.0-1.202、執行python-flink腳本 從kafka的demo獲取消…

數據結構速成

1. 數據結構與算法 2. 順序表 3. 鏈表 4. 棧與隊列 5. 串 6. 樹與二叉樹&#xff08;1&#xff09; 7. 樹與二叉樹&#xff08;2&#xff09; 8. 圖 9. 圖的應用 10. 查找 11. 排序&#xff08;1&#xff09; 12. 排序&#xff08;2&#xff09;

k8s的污點與容忍度

污點&#xff08;Taint&#xff09;針對節點來說&#xff0c;和節點親和性正好相對&#xff0c;節點親和性使Pod被吸引到一類特定的節點&#xff0c;而污點則使節點能夠排斥一類特定的Pod。 容忍度&#xff08;Toleration&#xff09;應用于Pod上&#xff0c;它用來允許調度器…

how to write 述職pptx as a tech manager

As a technical manager, crafting an effective 述職 (performance review) PPT requires you to highlight your leadership, team accomplishments, technical contributions, challenges faced, and future plans. Heres a structured approach to design your PPT: 1. Cov…

從源碼層級深入探索 Spring AMQP 如何在 Spring Boot 中實現 RabbitMQ 集成——消費者如何進行消費

本章節主要從底層源碼探索Spring Boot中RabbitMQ如何進行消費&#xff0c;至于RabbitMQ是如何使用如何生產消息&#xff0c;本章不做過多介紹&#xff0c;感興趣的小伙伴可以參考&#xff1a;從源碼層級深入探索 Spring AMQP 如何在 Spring Boot 中實現 RabbitMQ 集成——生產者…

計算機視覺中的邊緣檢測算法

摘要&#xff1a; 本文全面深入地探討了計算機視覺中的邊緣檢測算法。首先闡述了邊緣檢測的重要性及其在計算機視覺領域的基礎地位&#xff0c;隨后詳細介紹了經典的邊緣檢測算法&#xff0c;包括基于梯度的 Sobel 算子算法、Canny 邊緣檢測算法等&#xff0c;深入剖析了它們的…