淺談 JavaScript 的原型繼承(Prototype and Inheritance)與原型鏈

閱讀時間約 6 分鐘
JavaScript Object Prototype 示意圖

JavaScript Object Prototype 示意圖

在 JavaScript 中,每個Object(以下稱為物件)都有一個隱含的 [[Prototype]]屬性,它指向這個物件的原型(Prototype)。當試圖訪問物件的某個屬性時,如果這個物件本身沒有該屬性,那麼 JavaScript 引擎會繼續在它的 [[Prototype]] (aka prototype object) 上找這個屬性。這就是 JavaScript 的原型繼承(Prototypal Inheritance)與原型鏈(Prototype Chain)概念

附註:這篇文章提到的 Object 都是以 object literal (object initializer) 來創造,不考慮構造函數與 class 的情況。

Prototype Object 範例

我們先來看看這段程式碼:

const person = {
name: 'John',
sayName() {
console.log(this.name);
}
}

const student = {
school: 'ABC'
};

// 將 person 設置為 student 的 Prototype Object
Object.setPrototypeOf(student, person);

// 訪問 student 的 Prototype Object person 上的 sayName 方法
student.sayName(); // 輸出 John

上面的程式碼中,我們將 person 設置為 student 的 Prototype Object,這樣 student 就可以access到 person 上的屬性和方法,這就是 JavaScript Prototype Object 的作用,實現物件間的繼承與共享


這裡可能有個令人費解的片段:

Object.setPrototypeOf(student, person)

這是 ES6 提供的設定物件原型的方法。它接受兩個參數:第一個參數是要設置原型的物件、第二個參數是該物件的新原型。所以這行程式碼使 student 物件的隱式原型 [[Prototype]] 被設置為 person這個 Object。

這樣一來,當訪問 student 的屬性時,如果 student 不存在該屬性,就會去 person 物件上查找。student 物件就可以 access 到 person 的屬性與方法,實現了原型繼承

看起來很麻煩?為什麼要這樣做?可以繼續往下看,或是跳過這個段落 :


補充:proto屬性:[[Prototype]] & __proto__ 的差别

前面提到:

在 JavaScript 中,每個物件都有一個隱含的 [[Prototype]] 屬性,它指向該物件的 Prototype。

但為什麼在上面的程式碼中我們不直接修改它?這是因為[[Prototype]]是隱含的,無法被我們直接訪問、存取(access)。而__proto__ 可以說是這個隱含屬性的 getter/setter 介面(可以 access)

通過 __proto__ 我們可以設置物件的 Prototype Object:

// 通過 __proto__ 設置 Prototype Object
student.__proto__ = person;

student.sayName(); // John
但這種方式會有瀏覽器兼容性的問題,而且是過時的方式,我們不應該使用這個方法來修改prototype object。Object.setPrototypeOf 是更推薦的設定原型的方式。

新增原型繼承物件最簡單的方法:Object.create()

Object.create() 是 JavaScript 中實現 Prototypal Inheritance 最簡單的方法。

它可以以一個物件為原型,創建一個新的物件。不需要先新增物件後再去修改。可以比較兩種方法:

const person = {
name: 'John'
};

// Object.create() 直接新增一個 student 物件並把他的原型指定為 person
const student1 = Object.create(person);

// Object.setPrototypeOf() 先新增一個 student 物件再將其原型對象指定為 person
const student2 = {};
Object.setPrototypeOf(student2, person);

結果上來說,兩者是幾乎相同的,但在MDN的文件中基於效能考量更建議使用Object.create()的方法而不是Object.setPrototypeOf(student, person)

總結

Prototype 是 JavaScript 的核心概念之一,是實現繼承的基礎。

  • 每個 Object 都有一個內置的 [[Prototype]] 指向 Prototype Object
  • __proto__ 屬性可以訪問這個隱含的 Prototype
  • Prototype Object 可以繼續擁有自己的 Prototype,形成原型鏈(Prototype Chain)
  • Object.create() 可以簡單實現基於原型的繼承
  • 構造函數和類也是基於原型模型實現繼承的。

結語

因為篇幅的關係,這篇文章提到的 Object 都是基於 object literal (object initializer) ,不考慮構造函數與 class 的情況,希望未來還有機會寫一篇相關分享~

如果有興趣,可以參考JS基本觀念: 原型鏈(prototype chain) 有提到更多以構造函數來講解原型鏈的概念,或是直接看MDN的文件:Inheritance and the prototype chain

但因為這篇提到的概念是更底層的邏輯,我想在原理上應該是類似或相同的,只是語法上有所差異。如果喜歡這類的文章歡迎留言跟我說!有任何資訊錯誤也請務必留言告知,謝謝😊

9會員
12內容數
分享關於自我成長、筆記工具、科技、設計等相關文章
留言0
查看全部
發表第一個留言支持創作者!
DanielNotes 的其他內容
一位創業者的經驗和反思,從創業過程中遇到的挑戰和困難,到創業團隊的溝通,以及對台灣軟體基礎建設的看法。作者分享了他們團隊在創業旅程中學到的許多寶貴經驗和收穫,包括溝通、技術和市場上的困難、股權和公司設立等問題。雖然創業失敗,但這次經驗視為重要的成長和學習機會,相信這些將成為他們下一次創業的寶貴資產。
前言 本篇並沒有針對數位筆記工具進行個別比較與推薦選擇,而是聚焦於選擇數位筆記軟體、建立PKM系統時所衍生的問題與挫折。我自己在這個過程中投入很多精力,面對許多困惑,因此希望可以在這個滿地開花的工具教學文章中提供一些新的想法給正在為此焦慮迷惘的讀者。 卡片盒筆記法與PKM (Personal Kno
一位創業者的經驗和反思,從創業過程中遇到的挑戰和困難,到創業團隊的溝通,以及對台灣軟體基礎建設的看法。作者分享了他們團隊在創業旅程中學到的許多寶貴經驗和收穫,包括溝通、技術和市場上的困難、股權和公司設立等問題。雖然創業失敗,但這次經驗視為重要的成長和學習機會,相信這些將成為他們下一次創業的寶貴資產。
前言 本篇並沒有針對數位筆記工具進行個別比較與推薦選擇,而是聚焦於選擇數位筆記軟體、建立PKM系統時所衍生的問題與挫折。我自己在這個過程中投入很多精力,面對許多困惑,因此希望可以在這個滿地開花的工具教學文章中提供一些新的想法給正在為此焦慮迷惘的讀者。 卡片盒筆記法與PKM (Personal Kno
你可能也想看
Google News 追蹤
Thumbnail
這個秋,Chill 嗨嗨!穿搭美美去賞楓,裝備款款去露營⋯⋯你的秋天怎麼過?秋日 To Do List 等你分享! 秋季全站徵文,我們準備了五個創作主題,參賽還有機會獲得「火烤兩用鍋」,一起來看看如何參加吧~
Thumbnail
美國總統大選只剩下三天, 我們觀察一整週民調與金融市場的變化(包含賭局), 到本週五下午3:00前為止, 誰是美國總統幾乎大概可以猜到60-70%的機率, 本篇文章就是以大選結局為主軸來討論近期甚至到未來四年美股可能的改變
Thumbnail
Faker昨天真的太扯了,中國主播王多多點評的話更是精妙,分享給各位 王多多的點評 「Faker是我們的處境,他是LPL永遠繞不開的一個人和話題,所以我們特別渴望在決賽跟他相遇,去直面我們的處境。 我們曾經稱他為最高的山,最長的河,以為山海就是盡頭,可是Faker用他28歲的年齡...
Thumbnail
“搞定自己 的難度和必要性,遠勝於應付別人。”-蔡康永 “搞定自己”相對於”應付他人”而言,往往涉及到更高層次的難度和更深刻的必要性,這是因為搞定自己,需要個人多方面的實現內在成長,以及情感智慧和生活品質的提升 首先,搞定自己需要更多的自我認識和自我反省,這意味著深入了解自己,包括自我需求、
Thumbnail
你有曾經做過這樣的夢嗎? 夢中的你想擺脫你身後的不論是人或是東西, 你一直跑卻怎麼樣也擺脫不了。 其實追趕你的東西, 正是你的潛意識想要提醒你, 去挖掘和發展那些你平常未曾發現的領域。 你擁有力量強大的才能,只是現在還不夠成熟, 這種情況通常要跳脫舒適圈, 才能激發那個才
Thumbnail
為什麼有些中、英術語很難望文生義,很難從中、英詞彙的表面意思對應起來?這種情況,又該如何記住呢? 本文以「融資」、「融券」為例,為你頗析!
命理中財代表理性和現實,也代表女人的感情線,所以破財的男人較情緒化;而破財的女人較不溫柔且敢愛敢恨,而要改善這種困境可以用官殺的特質來讓財脫困,男人可以在工作上努力及女人可以交男朋友來讓自己變溫柔,而財也代表我管的東西及地位較低的人,所以破財也會看不起地位低的人或破壞物品。 若出現財破印則會有自大
Thumbnail
人的修行到了一定阶段,就会经历虚幻的过程,这些幻象是真是存在的,是虚空法界的东西,但是如果修行人做到有足够的定力,也即使人在幻象阶段,也能做到明辨是非,知道什么是对的,什么是错的。 若是错的,在幻象里的,那就不要去做。 在现实当中,也不要把虚空法界的东西当成现实,不能作真像去看待。
Thumbnail
很早期的学生,会听我讲过“缘法”。会知道要用“缘法”去看问题。但“缘法”究竟详细说的是什么?大家可能还是一知半解。 而隨着大家了解的东西越多,越來越觉得需要往上修,增加无漏功德,然后自己真的变好了时。突然就会想到一个问题,今生我能有这改变,有这些助力,全因为碰到我在讲这些东西,也因为我在讲的时候,
Thumbnail
倪海厦老师在天纪中提到了很多种断卦方法,这里只选取几个简单的方法进行概括,总结和简化,没有任何关于倪海厦老师知识的文章可以比得上倪海厦老师的原视频,建议各位看官从原视频中吸取更多好方法。
昨晚睡觉前,我把手机放在枕头边,躺在床上,听Youtbue 上,一位叫做LT视界的大咖讲解沈栋发表的《红色赌盘》中的一些细节。 这位大咖的分析非常到位。我之前也听过很多沈栋在台湾的访谈节目。我当初对于这位作者的印象还不错,觉得他思路很敏捷,谈吐不凡,见识广,的确是很有感染力,吸引力和洞察力。是个了不
今日看到一句话让我感触颇深,想到了成长与经历这些字眼,觉得有道理便记下这段话; 离群索居者,不是野兽便是神灵。 尤其是在学生时代这种感觉尤为强烈,却不知都是一群连价值观都没形成的孩子。这种现象在学校中尤为突出。 被孤立的人啊!愿你成为上帝的宠儿。
Thumbnail
這個秋,Chill 嗨嗨!穿搭美美去賞楓,裝備款款去露營⋯⋯你的秋天怎麼過?秋日 To Do List 等你分享! 秋季全站徵文,我們準備了五個創作主題,參賽還有機會獲得「火烤兩用鍋」,一起來看看如何參加吧~
Thumbnail
美國總統大選只剩下三天, 我們觀察一整週民調與金融市場的變化(包含賭局), 到本週五下午3:00前為止, 誰是美國總統幾乎大概可以猜到60-70%的機率, 本篇文章就是以大選結局為主軸來討論近期甚至到未來四年美股可能的改變
Thumbnail
Faker昨天真的太扯了,中國主播王多多點評的話更是精妙,分享給各位 王多多的點評 「Faker是我們的處境,他是LPL永遠繞不開的一個人和話題,所以我們特別渴望在決賽跟他相遇,去直面我們的處境。 我們曾經稱他為最高的山,最長的河,以為山海就是盡頭,可是Faker用他28歲的年齡...
Thumbnail
“搞定自己 的難度和必要性,遠勝於應付別人。”-蔡康永 “搞定自己”相對於”應付他人”而言,往往涉及到更高層次的難度和更深刻的必要性,這是因為搞定自己,需要個人多方面的實現內在成長,以及情感智慧和生活品質的提升 首先,搞定自己需要更多的自我認識和自我反省,這意味著深入了解自己,包括自我需求、
Thumbnail
你有曾經做過這樣的夢嗎? 夢中的你想擺脫你身後的不論是人或是東西, 你一直跑卻怎麼樣也擺脫不了。 其實追趕你的東西, 正是你的潛意識想要提醒你, 去挖掘和發展那些你平常未曾發現的領域。 你擁有力量強大的才能,只是現在還不夠成熟, 這種情況通常要跳脫舒適圈, 才能激發那個才
Thumbnail
為什麼有些中、英術語很難望文生義,很難從中、英詞彙的表面意思對應起來?這種情況,又該如何記住呢? 本文以「融資」、「融券」為例,為你頗析!
命理中財代表理性和現實,也代表女人的感情線,所以破財的男人較情緒化;而破財的女人較不溫柔且敢愛敢恨,而要改善這種困境可以用官殺的特質來讓財脫困,男人可以在工作上努力及女人可以交男朋友來讓自己變溫柔,而財也代表我管的東西及地位較低的人,所以破財也會看不起地位低的人或破壞物品。 若出現財破印則會有自大
Thumbnail
人的修行到了一定阶段,就会经历虚幻的过程,这些幻象是真是存在的,是虚空法界的东西,但是如果修行人做到有足够的定力,也即使人在幻象阶段,也能做到明辨是非,知道什么是对的,什么是错的。 若是错的,在幻象里的,那就不要去做。 在现实当中,也不要把虚空法界的东西当成现实,不能作真像去看待。
Thumbnail
很早期的学生,会听我讲过“缘法”。会知道要用“缘法”去看问题。但“缘法”究竟详细说的是什么?大家可能还是一知半解。 而隨着大家了解的东西越多,越來越觉得需要往上修,增加无漏功德,然后自己真的变好了时。突然就会想到一个问题,今生我能有这改变,有这些助力,全因为碰到我在讲这些东西,也因为我在讲的时候,
Thumbnail
倪海厦老师在天纪中提到了很多种断卦方法,这里只选取几个简单的方法进行概括,总结和简化,没有任何关于倪海厦老师知识的文章可以比得上倪海厦老师的原视频,建议各位看官从原视频中吸取更多好方法。
昨晚睡觉前,我把手机放在枕头边,躺在床上,听Youtbue 上,一位叫做LT视界的大咖讲解沈栋发表的《红色赌盘》中的一些细节。 这位大咖的分析非常到位。我之前也听过很多沈栋在台湾的访谈节目。我当初对于这位作者的印象还不错,觉得他思路很敏捷,谈吐不凡,见识广,的确是很有感染力,吸引力和洞察力。是个了不
今日看到一句话让我感触颇深,想到了成长与经历这些字眼,觉得有道理便记下这段话; 离群索居者,不是野兽便是神灵。 尤其是在学生时代这种感觉尤为强烈,却不知都是一群连价值观都没形成的孩子。这种现象在学校中尤为突出。 被孤立的人啊!愿你成为上帝的宠儿。