JavaScript中的繼承有哪些方式?各有什么優缺點

在 JavaScript 中,繼承主要通過原型鏈實現,常見的繼承方式有以下幾種,每種方式都有其優缺點:


1.?原型鏈繼承

1. 實現方式:將子類的原型對象指向父類的實例。

function Parent() {}
function Child() {}
Child.prototype = new Parent();

2. 優點:簡單直觀,能繼承父類原型上的屬性和方法。

3. 缺點

(1). 所有子類實例共享父類的引用類型屬性,修改一個實例會影響其他實例;

(2). 無法向父類構造函數傳遞參數,即子類實例化時無法定制父類屬性;


2.?構造函數繼承

1. 實現方式:在子類構造函數中調用父類構造函數。

function Parent(name) { this.name = name; }
function Child(name) { Parent.call(this, name); }

2. 優點

(1). 解決了引用類型屬性共享的問題,使得每個實例獨立;

(2).?支持向父類構造函數傳遞參數;

3. 缺點:無法繼承父類原型上的方法,方法只能在構造函數中定義,導致重復創建函數,浪費內存;


3.?組合繼承(經典繼承)

1. 實現方式:結合原型鏈繼承和構造函數繼承;

function Parent(name) { this.name = name; }
function Child(name) { Parent.call(this, name); }
Child.prototype = new Parent();
Child.prototype.constructor = Child;

2. 優點

(1). 既能繼承父類實例屬性,又能繼承父類原型方法;

(2). 引用類型屬性不共享,支持傳參;

3. 缺點:父類構造函數被調用兩次,分別為Parent.call 和 new Parent(),導致子類原型對象中多出一份冗余屬性;


4.?原型式繼承

1. 實現方式 :基于已有對象創建新對象,類似 Object.create

const parent = { name: "Parent" };
const child = Object.create(parent);

2. 優點:適用于不需要單獨構造函數的場景,直接基于對象繼承;

3. 缺點:引用類型屬性會被所有實例共享,這一點與原型鏈繼承相同;


5.?寄生式繼承

1. 實現方式:在原型式繼承的基礎上增強對象。

function createChild(parent) {const obj = Object.create(parent);obj.sayHi = function() { console.log("Hi"); };return obj;
}

2. 優點:可以在不修改原對象的情況下擴展新方法;

3. 缺點:方法在每次創建實例時重復定義,效率低;


6.?寄生組合式繼承(最優解)

1. 實現方式:通過寄生式繼承父類原型,避免調用父類構造函數;

function Parent(name) { this.name = name}
function Child(name) { Parent.call(this, name)}Child.prototype = Object.create(Parent.prototype);
prototype.constructor = Child;

2. 優點

(1). 解決了組合繼承中父類構造函數被調用兩次的問題,性能最優;

????(2). 完美實現原型鏈繼承,且引用類型屬性不共享;

3. 缺點:實現稍復雜;


7. ES6 class 繼承

1. 實現方式:使用 extends 和 super 關鍵字;

class Parent {constructor(name) {this.name = name;}
}
class Child extends Parent {constructor(name) {super(name);}
}

2. 優點

(1). 語法簡潔,符合傳統面向對象語言的寫法;

(2). 底層基于寄生組合式繼承,是最佳實踐的語法糖;

3. 缺點:需要環境支持 ES6+


8.?總結對比

推薦使用:現代開發中優先使用 ES6 class 繼承。兼容舊環境時使用 寄生組合式繼承。

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

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

相關文章

深入理解指針(3)(C語言版)

文章目錄 前言 一、字符指針變量二、數組指針變量2.1 數組指針變量是什么2.2 數組指針變量怎么初始化2.2.1 靜態初始化2.2.2 動態初始化 三、二維數組傳參的本質四、函數指針變量4.1 函數指針變量的創建4.2 函數指針變量的使用4.3 typedef關鍵字4.4拓展 五、函數指針數組六、轉…

Linux之 權限提升(Linux Privilege Escalation)

Linux 之權限提升 系統信息 1.獲取操作系統信息 2.檢查PATH,是否有任何可寫的文件夾? 3.檢查環境變量,有任何敏感細節嗎? 4.使用腳本(DirtyCow?)搜索內核漏洞 5.檢查sudo 版本是否存在漏洞…

【leetcode hot 100 215】數組中的第K個最大元素

解法一&#xff1a;維護最大最小值 -> 堆 -> k個元素的最小值堆 class Solution {public int findKthLargest(int[] nums, int k) {// 維護最大最小值 -> 堆 -> k個元素的最小值堆PriorityQueue<Integer> heap new PriorityQueue<>((n1, n2) -> n…

csp信奧賽C++常用的數學函數詳解

csp信奧賽C常用的數學函數詳解 在信息學奧林匹克競賽&#xff08;信奧賽&#xff09;中&#xff0c;C 的 <cmath> 頭文件提供了豐富的數學函數&#xff0c;用于高效處理數學運算。以下是常用系統數學函數的詳細講解及匯總表格。 絕對值函數 int abs(int x)&#xff1a;返…

Java IntelliJ IDEA 中配置多個 JDK 版本

目錄 一、添加多個 JDK 版本1. 下載并安裝多個 JDK 版本2. 配置 JDK 在 IntelliJ IDEA 中 二、在項目中切換 JDK 版本1. 設置項目使用的 JDK 版本2. 設置模塊使用的 JDK 版本 三、在運行配置中指定 JDK 版本四、總結 在實際開發中&#xff0c;我們常常需要在同一個項目中使用不…

ChatDBA VS DeepSeek:快速診斷 OceanBase 集群新租戶數據同步異常

社區王牌專欄《一問一實驗&#xff1a;AI 版》改版以來已發布多期&#xff08;51-60&#xff09;&#xff0c;展現了 ChatDBA 在多種場景下解決問題的效果。 下面讓我們正式進入《一問一實驗&#xff1a;AI 版》第 62 期&#xff0c;看看 ChatDBA 最新效果以及與熱門大模型 De…

Java條碼與二維碼生成技術詳解

一、技術選型分析 1.1 條碼生成方案 Barbecue是最成熟的Java條碼庫&#xff0c;支持&#xff1a; Code 128EAN-13/UPC-AUSPS Inteligent Mail等12種工業標準格式 1.2 二維碼方案對比 庫名稱維護狀態復雜度功能擴展性ZXing★★★★☆較高強QRGen★★★☆☆簡單一般BoofCV★…

air780eq 阿里云

硬件&#xff1a;APM32F030C8 Air 780eq 參考文檔&#xff1a; 合宙780E-4G模塊通過AT指令連接到阿里云平臺&#xff0c;實現信息的收發_air780e上傳阿里云屬性值at命令-CSDN博客 阿里云 - atair780eq - 合宙文檔中心 4G模塊接入阿里云-實現數據上傳和命令下發_4g模塊上傳…

oracle數據庫(數據庫啟動關閉/sqlplus登錄及基本操作/設置字符集/distinct去重)

目錄 1. Oracle數據庫啟動 2. Oracle數據庫關閉 3. sqlplus登錄Oracle數據庫 3.1 使用sqlplus登錄Oracle數據庫 3.2 使用sqlplus登錄Oracle數據庫 3.3 遠程登錄 3.4 解鎖用戶 3.5 修改用戶密碼 3.6 查看當前語言環境 4. sqlplus基本操作 4.1 顯示當前用戶 4.2 查看當前用戶…

Java 大視界 -- Java 大數據在智能金融區塊鏈跨境支付與結算中的應用(154)

&#x1f496;親愛的朋友們&#xff0c;熱烈歡迎來到 青云交的博客&#xff01;能與諸位在此相逢&#xff0c;我倍感榮幸。在這飛速更迭的時代&#xff0c;我們都渴望一方心靈凈土&#xff0c;而 我的博客 正是這樣溫暖的所在。這里為你呈上趣味與實用兼具的知識&#xff0c;也…

大模型詞表注入

大模型詞表注入&#xff08;Vocabulary Injection&#xff09; 大模型詞表注入&#xff08;Vocabulary Injection&#xff09;是指在預訓練語言模型&#xff08;如GPT、LLAMA等&#xff09;的基礎上&#xff0c;動態擴展其詞表&#xff08;Vocabulary&#xff09;的技術&#…

在Cesium中使用ThreeJs材質(不是場景融合哦)

在Cesium中使用ThreeJs材質(不是場景融合哦&#xff09;_嗶哩嗶哩_bilibili

初教六雙機一飛沖天動作要領

初教六雙機一飛沖天動作要領 初教六雙機“一飛沖天”是典型的垂直爬升特技動作&#xff0c;要求雙機以近乎垂直的姿態同步高速爬升&#xff0c;展現飛機的動力性能與編隊協同能力。以下是該動作的詳細技術解析與執行要點&#xff1a; 一、動作定義與特點 基本形態 雙機以相同速…

給Web開發者的HarmonyOS指南02-布局樣式

給Web開發者的HarmonyOS指南02-布局樣式 本系列教程適合鴻蒙 HarmonyOS 初學者&#xff0c;為那些熟悉用 HTML 與 CSS 語法的 Web 前端開發者準備的。 本系列教程會將 HTML/CSS 代碼片段替換為等價的 HarmonyOS/ArkUI 代碼。 布局基礎對比 在Web開發中&#xff0c;我們使用CS…

京東軟件測試崗位經典面試題(附答案)

1、黑盒測試的測試用例常見設計方法都有哪些&#xff1f;請分別以具體的例子來說明這些方法在測試用例設計工作中的應用。 1&#xff09;等價類劃分&#xff1a;等價類是指某個輸入域的子集合.在該子集合中&#xff0c;各個輸入數據對于揭露程序中的錯誤都是等效的.并合理地假…

3.26[a]paracompute homework

5555 負載不平衡指多個線程的計算量差異顯著&#xff0c;導致部分線程空轉或等待&#xff0c;降低并行效率。其核心矛盾在于任務劃分的靜態性與計算動態性不匹配&#xff0c;尤其在處理不規則數據或動態任務時尤為突出。以稀疏矩陣的向量乘法為例&#xff0c;假設其非零元素分…

網站安全專欄-------淺談CC攻擊和DDoS攻擊的區別

CC攻擊和DDoS攻擊都是網絡攻擊的類型&#xff0c;但它們在攻擊方式、目標和效果上有所不同。以下是它們之間的一些主要區別&#xff1a; ### 1. 定義 - **DDoS攻擊&#xff08;分布式拒絕服務攻擊&#xff09;**&#xff1a; DDoS攻擊是指攻擊者通過大量的分布式計算機&#x…

帕金森患者的生活重塑:從 “嘴” 開啟康復之旅

當提到帕金森病&#xff0c;許多人會聯想到震顫、僵硬和行動遲緩等癥狀。這種神經系統退行性疾病&#xff0c;給患者的生活帶來了巨大的挑戰。然而&#xff0c;你可知道&#xff0c;帕金森患者恢復正常生活&#xff0c;可以從 “嘴” 開始管理&#xff1f; 帕金森病在全球影響著…

Android14 Settings應用添加有線網開關條目實現

Android14 Settings應用添加有線網開關條目 文章目錄 Android14 Settings應用添加有線網開關條目一、前言二、適配修改1、network_provider_settings.xml2、NetworkProviderSettings.java3、TurnOnOffEthernetNetworkController.java4、去除有線網提示條目。5、效果UI&#xff…

Axure RP設計軟件中的各種函數:包括數字、數學、字符串、時間及中繼器函數,詳細解釋了各函數的用途、參數及其應用場景。

文章目錄 引言函數分類數字函數數學函數字符串函數時間函數函數中繼器函數引言 在axure交互設計時,函數可以用在條件公式和需要賦值的地方,其基本語法是用雙方括號包含,變量值和函數用英文句號連接。 在交互事件編輯器中通過fx按鈕插入函數表達式,例如設置文本內容為: …