原型繼承(prototypal inheritance)的工作原理

這是一個非常常見的 JavaScript 問題。所有 JS 對象都有一個__proto__屬性,指向它的原型對象。當試圖訪問一個對象的屬性時,如果沒有在該對象上找到,它還會搜尋該對象的原型,以及該對象的原型的原型,依次層層向上搜索,直到找到一個名字匹配的屬性或到達原型鏈的末尾。這種行為是在模擬經典的繼承,

1. 每個對象都有一個內部屬性 [[Prototype]]

  • 可以通過 __proto__ 訪問(不推薦)
  • 或通過 Object.getPrototypeOf(obj) 獲取
  • 或通過 Object.setPrototypeOf(obj, proto) 設置

2. 原型對象(prototype

  • 函數對象有一個 .prototype 屬性,它用于構建新對象的 [[Prototype]]
  • constructor 創建的新對象,其 __proto__ 指向該構造函數的 prototype

當你訪問一個對象的屬性時,例如:

obj.name

JS 引擎的執行順序如下:

  1. 當前對象 obj 中查找 name 屬性

  2. 如果沒有,就查找其原型對象 obj.__proto__ 中是否有 name

  3. 如果還沒有,就繼續沿著原型鏈向上查找,直到:

    • 找到為止(返回值)
    • 原型鏈終點 null(返回 undefined

📚 構造函數 + 原型鏈的組合方式(經典原型繼承)

function Animal(name) {this.name = name;
}Animal.prototype.sayHi = function() {console.log("Hi, I'm " + this.name);
};const cat = new Animal("Kitty");cat.sayHi(); // Hi, I'm Kitty
  • cat.__proto__ === Animal.prototype ?
  • Animal.prototype.__proto__ === Object.prototype ?

這條鏈一直延伸到 null 終點。

為什么 JavaScript 要設計“原型鏈繼承”機制? 我的另一種思考…

? 1. 動態語言需要靈活的繼承模型

JavaScript 是一種動態語言,強調:

  • 對象可以隨時添加/刪除屬性
  • 類和實例的界限模糊
  • 對象結構可隨運行時變化

?? 傳統的基于類(Class-based)繼承 結構較為死板、靜態,而 JS 初衷是用于瀏覽器腳本,需要靈活、輕量、動態。

原型繼承天然支持:

const a = { greeting: 'hi' };
const b = Object.create(a); // b 繼承自 a

無需類、構造函數,只要對象就能繼承對象,非常輕便。


🧱 2. 萬物皆對象,繼承也要“對象化”

不像 Java/C++ 使用 class 來定義繼承,JavaScript 一切都可以看作是對象(包括函數、數組等)。

  • JavaScript 設計者 Brendan Eich 的理念是: “對象應該能繼承另一個對象”
  • 所以不需要 class 和 instance 的強制約束 —— 只需鏈式對象(對象 → 原型對象 → 更高層原型…)。
obj --> obj.__proto__ --> obj.__proto__.__proto__ --> null

這就形成了所謂的 原型鏈(Prototype Chain)。


🧬 3. 共享行為、節省內存

多個對象可以共享一個原型中的方法和屬性,避免重復開銷:

const personMethods = {greet() { console.log('Hello'); }
};const p1 = Object.create(personMethods);
const p2 = Object.create(personMethods);p1.greet(); // Hello
p2.greet(); // Hello
  • 如果沒有原型機制,greet() 方法需要在每個對象上都拷貝一份(浪費內存)。
  • 通過原型鏈,“行為”可以被多個對象復用。

🧩 4. 實現靈活的“差異化對象”結構

原型機制允許對象“有差異地”繼承:

const animal = { move() {} };
const dog = Object.create(animal);
dog.bark = () => console.log('woof');
  • dog 是個有 bark 行為的 animal
  • 你可以定制對象之間的差異而不破壞它們的繼承結構

🚀 5. 支持動態補丁(Monkey Patching)和熱修復

因為原型是對象,運行時可以隨時改:

Array.prototype.sum = function() {return this.reduce((a, b) => a + b, 0);
};[1, 2, 3].sum(); // 6

JS 的生態系統(如 Polyfill、第三方補丁)大量利用了這種能力。這在 class 語言中是很難做到的。


🔄 6. 為未來引入 class 奠定基礎

ECMAScript 2015 (ES6) 中加入了 class 語法,其實只是原型的語法糖

class Person {sayHi() { console.log('hi'); }
}const p = new Person();

實際上等價于:

function Person() {}
Person.prototype.sayHi = function() { console.log('hi'); }
const p = new Person();

?? class 語法只是“看起來像傳統 OO”,底層仍然是原型鏈。


參考
  • https://www.quora.com/What-is-prototypal-inheritance/answer/Kyle-Simpson
  • https://davidwalsh.name/javascript-objects

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

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

相關文章

OpenCV 視頻處理與攝像頭操作詳解

1. 引言大家都來寫OpenCV😊,學的好開心!2. 視頻基礎與OpenCV簡介2.1 視頻的定義視頻(Video)是由一系列靜態圖像(幀)以一定速率連續播放形成的動態影像。其本質是利用人眼的視覺暫留效應&#xf…

Agentic AI 的威脅與緩解措施

原文:https://www.aigl.blog/content/files/2025/04/Agentic-AI—Threats-and-Mitigations.pdf AI Agent 的定義 1. 定義與基礎 智能代理(Agent)的定義: 智能代理是一種能夠感知環境、進行推理、做出決策并自主采取行動以實現特定…

ArrayList列表解析

ArrayList集合 ArrayList 的底層是數組隊列,相當于動態數組。與 Java 中的數組相比,它的容量能動態增長。在添加大量元素前,應用程序可以使用ensureCapacity操作來增加 ArrayList 實例的容量。這可以減少遞增式再分配的數量。 ArrayList 繼承…

《戀與深空》中龍和蛇分別是誰的代表

在《戀與深空》宏大而神秘的世界觀中,每一個符號都蘊含著深意。當玩家們熱議“龍”和“蛇”這兩種強大而古老的生物究竟代表著誰時,所有的線索都默契地指向了同一個名字——秦徹。 他不僅是力量與權威的象征“惡龍”,也是背負著宿命與糾葛的“…

gitignore添加后如何生效?

清除 Git 緩存: git rm -r --cached .添加文件到 Git:git add .使用 git commit 命令提交這些更改git commit -m "Update .gitignore"

多尺度頻率輔助類 Mamba 線性注意力模塊(MFM),融合頻域和空域特征,提升多尺度、復雜場景下的目標檢測能力

在偽裝物體檢測領域,現有方法大多依賴空間局部特征,難以有效捕捉全局信息,而 Transformer 類方法雖能建模長距離依賴關系,卻存在計算成本高、網絡結構復雜的問題。同時,頻域特征雖具備全局建模能力,可頻繁的…

Dify的默認端口怎么修改

1.定位配置文件 在 Dify 的安裝目錄中找到 .env 文件(通常位于 docker/ 子目錄下)。此文件定義了 Docker 容器的環境變量,包括端口配置。 2.調整端口參數 修改以下兩個關鍵配置項: # Docker 容器內部 Nginx 監聽的端口&#xf…

Go內存分配

圖解Go語言內存分配 - 知乎 go內置運行時,采用了自主管理,實現更好的內存使用模式,不需要每次內存分配都進行系統調用 采用TCMalloc算法:把內存分為多級管理,從而降低鎖的粒度 將可用的堆內存采用二級分配的方式進行…

cursor使用mcp連接mysql數據庫,url方式

背景。 用cursor生成后端代碼。讓cursor可以創建響應的表結構以及插入數據。使用的cursor版本是1.2.1 cursor 官網 mcp 說明smithery 中mysql mcp這個mcp具有建表的本領。 在cursor中是這樣配置的。 以上這種配置方式是是通過在smithery 網站中配置好自己的mysql數據庫連接后才…

Twisted study notes[1]

文章目錄serverreferencesserver Twisted usually using subclass twisted.internet.protocol.Protocol to treat protocols .Protocol is a fundamental class in Twisted for implementing network protocols.protocol class instant don’t exists forever because of it w…

Python 數據建模與分析項目實戰預備 Day 6 - 多模型對比與交叉驗證驗證策略

? 今日目標 引入多種常見分類模型(隨機森林、支持向量機、K近鄰等)比較不同模型的訓練效果使用交叉驗證提升評估穩定性🧾 一、對比模型列表模型類名(sklearn)適用說明邏輯回歸LogisticRegression基礎線、易于解釋KNNK…

xss-labs 1-8關

level1打開檢查&#xff0c;發現test直接放入h2標簽中此時通過script繞過h2標簽構造payload127.0.0.1/xss-labs/lvel1.php?name<script>alert(111)</script>直接使用script標簽繞過h2,并執行alert,通過level2打開檢查&#xff0c;輸入的123被放在input標簽里面的v…

Conda 核心命令快速查閱表

本表旨在提供一個簡潔、高效的 Conda 命令參考&#xff0c;專注于最常用功能的快速查找。 1. 環境管理 (Environment Management)功能 (Function)命令 (Command)示例 (Example)創建新環境conda create -n <env_name> [packages...]conda create -n myenv python3.9 panda…

音視頻學習(三十九):IDR幀和I幀

主要區分&#xff1a;I 幀 是幀內編碼幀&#xff0c;IDR 幀 是一種特殊的 I 幀&#xff0c;它是“清除參考幀鏈的強制切斷點”。H.264 視頻結構 結構 H.264 視頻由多個 NAL&#xff08;Network Abstraction Layer&#xff09;單元 構成&#xff0c;每一幀圖像可由一個或多個 NA…

人工智能與機器學習暑期科研項目招募(可發表論文)

人工智能與機器學習暑期科研項目招募 華中科技大學博士論文指導我是計算機專業的研二學生&#xff1a;從大二開始接觸科研&#xff0c;至今已發表1篇CCF-A類會議論文、1篇CCF-B類會議論文&#xff0c;以及2篇Top期刊論文。正是這段從本科開始的科研經歷&#xff0c;讓我在保研和…

C盤爆滿?一鍵清理恢復極速體驗!“小番茄C盤清理”徹底解放你的電腦

目錄 前言 C盤變紅&#xff1f;&#xff01;那么你的電腦將會出現下面糟糕的情況&#xff1a; 一、小番茄C盤清理介紹——拯救你的C盤爆紅&#xff01; 二、安裝登錄小番茄C盤清理 2.1 安裝小番茄C盤清理 2.2 登錄—擁有專屬自己電腦的小番茄C盤清理 三、手把手教你深度…

UI前端大數據可視化實戰技巧:如何利用數據故事化提升用戶參與度?

hello寶子們...我們是艾斯視覺擅長ui設計、前端開發、數字孿生、大數據、三維建模、三維動畫10年經驗!希望我的分享能幫助到您!如需幫助可以評論關注私信我們一起探討!致敬感謝感恩!一、引言&#xff1a;從 “圖表堆砌” 到 “故事共鳴” 的可視化革命當企業管理者面對布滿折線…

CSS基礎1.1

HTML骨架<!DOCTYPE html> <!-- 中文網站 --> <html lang"zh-CN"> <head><!--charset"UTF-8" 規定網頁的字符編碼 --><meta charset"UTF-8"><!-- ie(兼容性差) / edge --><meta http-equiv"X…

前端基礎JavaScript 筆記

本文是基于 B 站 pink 老師前端 JavaScript 課程整理的學習筆記 JS簡介 JavaScript是一種運行在客戶端&#xff08;瀏覽器&#xff09;的編程語言 作用&#xff1a;1.網頁特效(監聽用戶的一些行為讓網頁作出對應的反饋) 2.表單驗證(針對表單數據的合法性進行判斷) 3.數據交互…

「小程序開發」項目結構和頁面組成

微信小程序目錄 微信小程序的目錄,每種文件都有特定用途,組合起來才能構建完整應用。 小程序最基本的目錄結構通常包含這些部分: my-miniprogram/ ├── pages/ // 存放所有頁面 │ ├── index/ // 存放index頁面的邏輯文件 │ └── logs/ …