JavaScript 中的原型鏈與繼承

JavaScript 是一種基于原型的編程語言,這意味著它的對象繼承是通過原型鏈而非類的機制來實現的。原型鏈是 JavaScript 中對象與對象之間繼承屬性和方法的基礎。本文將深入探討 JavaScript 中的原型鏈和繼承機制,幫助你理解這一重要概念。

一、原型(Prototype)的概念

在 JavaScript 中,每個對象都有一個內置屬性 [[Prototype]],通常我們通過 __proto__ 或者 Object.getPrototypeOf() 來訪問它。這個原型對象本身也是一個對象,并且它也有自己的原型。通過這種方式,JavaScript 實現了對象之間的繼承。

每個 JavaScript 對象都直接繼承自一個原型對象,而這個原型對象又可以有自己的原型。這種層級關系被稱為 原型鏈

二、原型鏈的工作原理

原型鏈的工作原理可以通過以下步驟來理解:

  1. 對象的原型:每個對象都可以通過?Object.getPrototypeOf(obj)?或者?obj.__proto__?來訪問其原型。
  2. 查找屬性和方法:當我們訪問對象的屬性或方法時,JavaScript 引擎會首先檢查該對象是否有該屬性。如果對象自身沒有該屬性,它會查找對象的原型,如果原型沒有,它會繼續查找原型的原型,這一過程會一直向上查找,直到找到該屬性或者到達原型鏈的頂端(null)。
    let animal = {species: "Dog",speak: function() {console.log(this.species + " barks!");}
    };let dog = Object.create(animal);
    dog.species = "Beagle";dog.speak();  // 輸出 "Beagle barks!"

    在上面的代碼中,dog 對象沒有 speak 方法和 species 屬性,但它通過原型鏈繼承了 animal 對象的 speak 方法和 species 屬性。當我們訪問 dog.speak() 時,JavaScript 引擎首先在 dog 對象本身查找,沒找到就到 animal 對象上去找。

三、構造函數與原型鏈

JavaScript 中的對象通常是通過構造函數來創建的,而構造函數本身也是一個函數對象,每個構造函數都有一個 prototype 屬性,這個屬性指向構造函數的原型對象。

當通過構造函數創建一個實例時,這個實例會自動繼承構造函數原型上的屬性和方法。讓我們來看一個例子:

function Animal(name) {this.name = name;
}Animal.prototype.speak = function() {console.log(this.name + ' makes a noise');
};let dog = new Animal('Buddy');
dog.speak();  // 輸出 "Buddy makes a noise"

在這段代碼中,Animal 是一個構造函數,我們通過 new Animal() 創建了一個 dog 實例。dog 實例的原型指向 Animal.prototype,因此它能夠訪問 Animal.prototype 上的 speak 方法。

四、繼承的實現

在 JavaScript 中,繼承并不像其他面向對象編程語言那樣通過類的繼承來實現,而是通過原型鏈來實現的。JavaScript 提供了多種方式來實現繼承,常見的有以下幾種:

1. 通過構造函數實現繼承

通過調用父類構造函數和修改子類的原型,可以實現繼承。

function Animal(name) {this.name = name;
}Animal.prototype.speak = function() {console.log(this.name + ' makes a noise');
};function Dog(name) {Animal.call(this, name);  // 繼承父類的屬性
}Dog.prototype = Object.create(Animal.prototype);  // 繼承父類的方法
Dog.prototype.constructor = Dog;  // 修正構造函數指向let dog = new Dog('Buddy');
dog.speak();  // 輸出 "Buddy makes a noise"

在上面的代碼中,我們使用 Animal.call(this, name) 來調用父類的構造函數,從而繼承了父類的屬性。然后,我們將 Dog.prototype 設置為 Object.create(Animal.prototype),這樣 Dog 就繼承了 Animal 的方法。

2. 通過 ES6 的?class?語法實現繼承

ES6 引入了類的語法,使得繼承更加直觀和易于使用。通過 extends 關鍵字,我們可以更輕松地實現繼承

class Animal {constructor(name) {this.name = name;}speak() {console.log(this.name + ' makes a noise');}
}class Dog extends Animal {constructor(name) {super(name);  // 調用父類構造函數}
}let dog = new Dog('Buddy');
dog.speak();  // 輸出 "Buddy makes a noise"

在 ES6 的 class 語法中,我們使用 extends 來繼承父類,并通過 super() 來調用父類的構造函數。ES6 的 class 語法實際上是對傳統 JavaScript 原型鏈繼承的一種封裝。

五、總結

JavaScript 中的繼承和原型鏈是相互依存的。每個對象都通過原型鏈來繼承另一個對象的屬性和方法,而這一機制使得 JavaScript 的面向對象編程具有非常大的靈活性。雖然 JavaScript 沒有傳統的類和繼承機制,但通過原型鏈,我們依然可以實現強大的繼承和多態機制。

原型鏈提供了對象之間共享和復用代碼的能力,使得我們能夠構建更加高效和模塊化的代碼。理解原型鏈和繼承的工作原理,是深入掌握 JavaScript 的關鍵之一。

希望這篇博客對你有所幫助!如果有任何問題或建議,歡迎留言討論

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

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

相關文章

2.pycharm部署Ai - 編程好助手

一、pycharm安裝continue插件 1.提前安裝好pycharm,并雙擊打開 2.File – Setting 3.Plugins – 搜索Continue , 點擊Install安裝 4.點ok 二、獲取硅基流動API 1.登入網站:https://siliconflow.cn/zh-cn/#/,并注冊登入 2.獲取AP…

【藍橋杯14天沖刺課題單】Day3

1. 題目鏈接:1025 答疑 貪心類型的題目做法很簡單,只需要保證局部解最優即可保證整體解最優。 這里的思路就是第i個學生前面的人答疑所用的時間最短,那么他所發送短信的時間節點越小。這道題目有個需要注意的點是:要先將前i-1個…

虛擬pinctrl驅動

之前呢,我們講解了在內核中pinctrl子系統是怎么實現的,今天我們來嘗試一下自己去寫一個pinctrl子系統: 首先呢,我們來看看一個pinctrl子系統需要做的事情: 上面的話,我們看了一個pinctrl子系統需要的三大功能以及在驅…

Spring Boot自動配置原理解析

文章目錄 前言一、SpringBootConfiguration二、EnableAutoConfiguration2.1、AutoConfigurationPackage2.2、Import(AutoConfigurationImportSelector.class) 三、ComponentScan四、自動配置源碼4.1、獲取所有候選的自動配置類4.2、過濾不滿足條件的自動配置 總結 前言 在常規的…

2025/3/20 心得

第一題。 M. B - Smartphone Addiction 問題描述 高橋的智能手機電池容量為NN毫安時。在時間0.50.5、1.51.5、2.52.5等時刻(即對于每個整數nn,時間為n 0.5n0.5),電池電量減少11毫安時。 高橋將在時間00帶著充滿電的手機離開…

MQTT之重復消息(6、在項目中遇到的問題)

項目背景: 在 Spring Boot MQTT 5.0 環境中,RTU設備向SpringBoot平臺發送心跳數據、業務監控數據。同時SpringBoot平臺可以向RTU設備下發指令,RTU在執行完指令之后向平臺發送響應數據。 問題一、SpingBoot平臺發送指令給RTU設備,RTU設備能夠…

Cesium 全面介紹

一、Cesium 是什么? Cesium 是一個開源的 JavaScript 庫,專門用于構建高性能的 3D 地理空間可視化應用。它基于 WebGL 技術,無需插件即可在瀏覽器中渲染全球地形、影像、3D 模型、矢量數據等,支持從衛星視角到地下管網的 全維度空…

Trae-中國首款免費AI原生IDE

Trae 簡介 Trae 是由字節跳動于2025年1月推出的國內首個原生AI集成開發環境(IDE),旨在通過AI技術賦能開發者,簡化編程流程。其核心功能基于Claude 3.5和GPT-4o等先進AI模型,支持智能代碼生成、優化及多模態交互&#…

1.3 斐波那契數列模型:LeetCode 746. 使用最小花費爬樓梯

動態規劃解最小花費爬樓梯問題:LeetCode 746. 使用最小花費爬樓梯 1. 題目鏈接 LeetCode 746. 使用最小花費爬樓梯 題目要求:給定一個整數數組 cost,其中 cost[i] 是從樓梯第 i 階向上爬所需支付的費用。你可以從下標 0 或 1 的臺階開始爬&a…

游戲開發中的貝塞爾曲線:感受絲滑的數學之美

這是一篇vip文章,如果你還不是vip,可以移步https://www.ilikexff.cn/articles/165免費閱讀。 介紹 貝塞爾曲線是計算機圖形學中最重要的概念之一,以其在表示曲線時的靈活性和精確性而聞名。廣泛應用于計算機圖形學、動畫、路徑規劃等領域的數學曲線。 貝塞爾曲線的數學原理基…

強化學習課程:stanford_cs234 學習筆記(2)introduction to RL

提示:文章寫完后,目錄可以自動生成,如何生成可參考右邊的幫助文檔 文章目錄 前言5、強化學習課程大綱5.1 課程內容主:5.2 馬爾可夫決策過程:5.2.1 馬爾可夫性 markov propterty5.2.2 馬爾可夫過程 markov process5.2.3…

第 26 場 藍橋月賽 部分題解

第 26 場 藍橋月賽 2.燈籠猜謎3.元宵分配4.擺放湯圓5.元宵交友(運行超時 通過90%) 2.燈籠猜謎 分析:以當前位置為視角,要想移動的距離盡可能的少,按順序猜謎語,給你一個區間,有三種情況&#xf…

JAVA實戰開源項目:體育館使用預約平臺(Vue+SpringBoot) 附源碼

本文項目編號 T 144 ,文末自助獲取源碼 \color{red}{T144,文末自助獲取源碼} T144,文末自助獲取源碼 目錄 一、系統介紹二、數據庫設計三、配套教程3.1 啟動教程3.2 講解視頻3.3 二次開發教程 四、功能截圖五、文案資料5.1 選題背景5.2 國內…

解決【vite-plugin-top-level-await】 插件導致的 Bindings Not Found 錯誤

解決【vite-plugin-top-level-await】 插件導致的 Bindings Not Found 錯誤 環境設置 操作系統: macOS硬件平臺: M1 Pro前端框架: Vue 3Node.js 版本: 20 在使用 Vue 項目時,我們嘗試集成 vite-plugin-top-level-await 插件以支持頂層 await 語法。然而&#xff…

推薦系統(十九):優勢特征蒸餾(Privileged Features Distillation)在商品推薦中的應用(二)

在上一篇文章《推薦系統(十八):優勢特征蒸餾(Privileged Features Distillation)在商品推薦中的應用》中,筆者實現了一個基于 PFD 思想的 Demo。其中,Teacher 模型和 Student 模型都是簡單的單任務(CTR)模型,在本節,筆者將基于 PFD 思想實現一個多任務模型:其中,Tea…

深度學習之卷積

從全連接到卷積 MLP的缺陷,假設有如下的場景: 分類貓和狗的圖片 使用一個還不錯的相機采集圖片(12M像素)RGB圖片有 36M元素使用100大小的單隱藏層MLP,模型有 3.6B元素 遠多于世界上所有貓和狗總數(900M狗,600M貓) …

目標識別與雙目測距(1)環境搭建:Ubuntu+yolov5+pcl庫

環境情況 ubuntu 18.04 → 20.04(最終) 安裝Ubuntu1804虛擬機系統 Anaconda:可參考我的另一篇文章 Python 3.6.13 → 3.8(最終)Anaconda3-2021.05 目標識別:YOLOv5相關 1、安裝git sudo apt install gi…

LinuxTCP/UDP基礎概念

TCP(傳輸控制協議) TCP 是一種面向連接的、可靠的、基于字節流的傳輸層通信協議。它的主要特點包括: 面向連接:在傳輸數據之前,需要通過“三次握手”建立連接;傳輸結束后,通過“四次揮手”斷開…

MP3、WAV、RM、PNG格式

MP3、WAV、RM、PNG格式 MP3 是一種音頻壓縮格式,采用了 MPEG-1 Audio Layer 3 或 MPEG-2 Audio Layer 3 編碼標準.MP3 格式能夠以較小的文件大小存儲高質量的音頻,可在多種設備如手機、MP3 播放器、電腦上播放,是目前應用最廣泛的音頻格式之一. MPEG-1 是MPEG(Moving Pictu…

力扣hot100:滑動窗口——找到字符串中所有字母異位詞

題目鏈接:找到字符串中所有字母異位詞 考慮用滑動窗口,窗口大小固定為字符串p的長度,用一個for循環控制子串的結束位置。 怎么判斷是字母異位詞? 1、排序:字符串中所有符合條件的字母異位詞與目標串p在經過排序后是…