原型、原型對象

通俗理解:“類的原型對象就是一塊區域里有這個類的實例對象通用的屬性和方法

?這就是 JavaScript 中原型(prototype)的核心作用和設計理念。??

  1. ??“一塊區域” = 原型對象本身(如?String.prototype,?Array.prototype,?MyClass.prototype):??

    • 這是一個實實在在存在的 JavaScript 對象。
    • 它就是為特定“類”(或更準確地說,為通過特定構造函數創建的對象)專門開辟的共享資源池
  2. ??“有...通用的屬性和方法” = 原型對象上定義的屬性和方法:??

    • 開發人員(或語言本身)會將所有該類型對象需要共享的功能(方法)和可能需要的共享數據(屬性)放入這個“區域”中。
    • 例如:
      • 所有字符串都要會用?.toUpperCase(),?.slice()?→ 這些方法就存在?String.prototype?這個“區域”里。
      • 所有數組都要會用?.map(),?.filter(),?.push()?→ 這些方法就存在?Array.prototype?這個“區域”里。
      • 你自己定義了一個?Person?類,所有?Person?實例都要能?.sayHello()?→ 這個方法就定義在?Person.prototype?這個“區域”里。
  3. ??“實例對象通用的” = 通過原型鏈實現共享:??

    • 關鍵機制:當您通過?new Constructor()?創建一個實例(比如?const myStr = new String('hello');?或?const p = new Person('Alice');),這個新對象內部會自動連接(指向)構造函數的?prototype?對象(那個“區域”)。
    • ?當你訪問這個實例的屬性或方法時(如?myStr.toUpperCase()?或?p.sayHello()):??
      • JavaScript 引擎會首先在實例對象自身屬性中查找。
      • ?如果在實例自身沒找到,它會自動去您說的那個“共享區域”(即原型對象)里去查找!??
    • 這個過程就是原型鏈查找。正是這個機制,使得所有實例都能復用定義在原型對象上的屬性和方法,實現了您所說的“通用”。
1. 原型對象(Prototype Object)??

? 定義:
"原型對象是每個JavaScript函數自帶的prototype屬性指向的特殊對象。它存儲了該構造函數創建的所有實例共享的屬性和方法。"

? 核心特點:

  1. 是構造函數(類)的共享方法容器
  2. 通過構造函數.prototype直接訪問
  3. constructor屬性指回構造函數本身
?2. 原型(Prototype)??

? 定義:
"原型是JavaScript中每個對象內部維護的隱式繼承鏈接?(通過__proto__Object.getPrototypeOf()訪問)。它決定了屬性和方法的查找路徑。"

? 核心機制:

  1. 形成原型鏈(prototype chain)實現繼承
  2. 屬性查找規則:對象自身 → 原型鏈向上查找 → 終點null
  3. 函數.prototype是其實例的原型起點

原型對象和通過構造函數創建的實例對象

?相同點:

?都是對象(Object 類型)?

class MyClass {}
const a = new String("hello");      // a 是字符串對象
const protoObj = MyClass.prototype;  // protoObj 是原型對象console.log(typeof a);         // "object"
console.log(typeof protoObj);  // "object"

?本質區別:

?特征??普通對象 (如?a)???原型對象 (構造函數.prototype)??
?創建方式?new 構造函數()?或字面量函數聲明時自動創建
?核心作用?存儲數據/業務邏輯作為共享方法的容器
?特殊屬性?必含?constructor?指向構造函數
?內存中的角色?實例對象其他對象的原型模板
?示例?a.indexOf("e")?(數據操作)String.prototype.indexOf = function(){}?(方法定義)
?關鍵關系:
const str = new String("test");// 原型對象在繼承鏈的上游
console.log(str.__proto__ === String.prototype,  // true:實例的隱式原型指向原型對象str instanceof String                // true:繼承關系的體現
);// 原型對象本身也是普通對象
console.log(String.prototype instanceof Object   // true:原型對象也是對象
);
總結:

"?原型對象是特殊的共享容器對象,普通對象是數據載體
當執行?var a = new String()

  • a?是實例對象?(用于操作數據)
  • String.prototype?是原型對象?(存儲所有字符串共享方法)
    它們的共性是都是對象,差異在于在原型系統中的角色和定位不同。"

結論:

  • 原型對象和實例對象都是對象,但原型對象是構造函數的屬性,實例對象是構造函數創建的對象。
  • 它們通過原型鏈連接:實例對象的隱式原型(__proto__)指向構造函數的原型對象(prototype)。

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

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

相關文章

STM32 IIC通信(寄存器與hal庫實現)

一、IIC基礎知識 1. 串口通信與IIC通信串口通信通常需要至少三條線(TX、RX和GND),而 I2C 總線僅需要兩條信號線(SDA和SCL);串口通信僅支持一對一通信,而 I2C 總線支持多機通信,允許單…

寶塔 php支持sqlserver

PDOException: SQLSTATE[IMSSP]: This extension requires the Microsoft ODBC Driver for SQL Server to communicate with SQL Server.錯誤原因這是 PHP 試圖連接 SQL Server 數據庫,但缺少必要的 ODBC 驅動支持 導致的。具體來說:你使用的是 PDO_SQLS…

day02-數組part02

一、長度最小的子數組(滑動窗口) leetcode 209 長度最小子數組 這道題的核心思想就是使用滑動窗口,滑動窗口三板斧: 初始位置i滑動窗口長度j-i1結束位置j 我們在寫代碼時是通過for循環來控制結束位置j,而初始位置i…

天愛驗證碼深度解析:從原理到實戰,構建 Web 安全新防線

在網絡安全日益嚴峻的當下,驗證碼作為抵御自動化攻擊的重要屏障,其性能與可靠性直接關系到系統的安全穩定。天愛驗證碼(TIANAI CAPTCHA)作為國內優秀的開源行為驗證碼解決方案,憑借獨特的技術優勢,在電商、…

軟考(軟件設計師)軟件工程-軟件質量,軟件測試,McCabe圈復雜度

軟件質量 ISO/IEC 9126 是軟件工程領域的經典質量模型,于1991年首次發布,2001年更新后成為軟件產品質量評估的國際標準。其核心貢獻是將抽象的“質量”概念分解為可度量、可管理的特性體系。以下是深度解析(2023年行業實踐視角)&a…

CentOS7環境安裝包部署并配置MySQL5.7

卸載MySQL卸載MySQL5.71、關閉MySQL5.7服務service mysqld stop2、查看MySQL安裝rpm -qa|grep -i mysqlmysql-community-libs-5.7.35-1.el7.x86_64mysql-community-libs-compat-5.7.35-1.el7.x86_64mysql-community-common-5.7.35-1.el7.x86_64mysql57-community-release-el7-1…

1-Git安裝配置與遠程倉庫使用

Git安裝配置與遠程倉庫使用 1. Git 下載與安裝 ① 進入Git 官網 https://git-scm.com/ ② 選擇合適系統版本下載,本文以windows為例進行下載 當前最新版本為 2.50.1 ,瀏覽器默認下載很慢,用迅雷比較快 ③ 安裝Git 我安裝在D盤 等待完…

開源“具身大腦” 實現不同機器人群體協作-RoboBrain

開源“具身大腦” 實現不同機器人群體協作-RoboBrain 具身大小腦協作框架RoboOS與開源具身大腦RoboBrain,實現跨場景多任務輕量化快速部署與跨本體協作,推動單機智能邁向群體智能,為構建具身智能開源統一生態加速場景應用提供底層技術支持。支…

【筆記】訓練步驟代碼解析

目錄 config參數配置 setup_dirs創建訓練文件夾 load_data加載數據 build_model創建模型 train訓練 記錄一下訓練代碼中不理解的地方 config參數配置 config {data_root: r"D:\project\megnetometer\datasets\WISDM_ar_latest\organized_dataset",train_dir: t…

Java填充Word模板

文章目錄前言一、設置word模板普通字段列表字段復選框二、代碼1. 引入POM2. 模板放入項目3.代碼實體類工具類三、測試四、運行結果五、注意事項前言 最近有個Java填充Word模板的需求,包括文本,列表和復選框勾選,寫一個工具類,以此…

【MYSQL8】springboot項目,開啟ssl證書安全連接

文章目錄一、開啟ssl證書1、msysql部署時默認開啟ssl證書2、配置文件3、創建用戶并指定ssl二、添加Java信任庫1、使用 keytool 導入證書2、驗證證書是否已導入三、修改連接配置一、開啟ssl證書 1、msysql部署時默認開啟ssl證書 可通過命令查看: SHOW VARIABLES L…

Telegraf vs. Logstash:實時數據處理架構中的關鍵組件對比

在現代數據基礎設施中,Telegraf 和 Logstash 是兩種廣泛使用的開源數據收集與處理工具,但它們在設計目標、應用場景和架構角色上存在顯著差異。本文將從實時數據處理架構、時序數據庫集成、消息代理支持等方面對比兩者的核心功能,并結合實際應…

Vue Vue-route (4)

Vue 漸進式JavaScript 框架 基于Vue2的學習筆記 - Vue-route 編程式導航和幾種路由 目錄 編程式導航 詳情組件 創建組件 設置路由 電影列表 傳參 另一種方式 動態路由 命名路由 別名 總結 編程式導航 點擊電影列表 跳轉電影詳情 詳情組件 創建組件 在views中創…

存在兩個cuda環境,在conda中切換到另一個

進入 openmmlab 環境 conda activate openmmlab 設置環境變量為 CUDA 12.4(只影響當前 shell 會話) export PATH/usr/local/cuda-12.4/bin:PATHexportLDLIBRARYPATH/usr/local/cuda?12.4/lib64:PATH export LD_LIBRARY_PATH/usr/local/cuda-12.4/lib64:…

Django 視圖(View)

1. 視圖簡介 視圖負責接收 web 請求并返回 web 響應。視圖就是一個 python 函數,被定義在 views.py 中。響應可以是一張網頁的 HTML 內容、一個重定向、一個 404 錯誤等等。響應處理過程如下圖: 用戶在瀏覽器中輸入網址:www.demo.com/1/100Django 獲取網址信息,去除域名和端…

HarmonyOS基礎概念

一、OpenHarmony、HarmonyOS和Harmony NEXT區別OpenHarmony是由開放原子開源基金會(OpenAtom Foundation)孵化及運營的開源項目,開放原子開源基金會由華為、阿里、騰訊、百度、浪潮、招商銀行、360等十家互聯網企業共同發起組建。目標是面向全…

spark3 streaming 讀kafka寫es

1. 代碼 package data_import import org.apache.spark.sql.{DataFrame, Row, SparkSession, SaveMode} import org.apache.spark.sql.types.{ArrayType, DoubleType, LongType, StringType, StructField, StructType, TimestampType} import org.apache.spark.sql.functions._…

【跟著PMP學習項目管理】每日一練 - 3

1、你是一個建筑項目的項目經理。電工已經開始鋪設路線,此時客戶帶著一個變更請求來找你。他需要增加插座,你認為這會增加相關工作的成本。你要做的第一件事? A、拒絕做出變更,因為這會增加項目的成本并超出預算 B、參考項目管理計劃,查看是否應當處理這個變更 C、查閱…

CentOS 安裝 JDK+ NGINX+ Tomcat + Redis + MySQL搭建項目環境

目錄第一步:安裝JDK 1.8方法 1:安裝 Oracle JDK 1.8方法 2:安裝 OpenJDK 1.8第二步:使用yum安裝NGINX第三步:安裝Tomcat第四步:安裝Redis第五步:安裝MySQL第六步:MySQL版本兼容性問題…

如何設計一個登錄管理系統:單點登錄系統架構設計

關鍵詞:如何設計一個登錄管理系統、登錄系統架構、用戶認證、系統安全設計 📋 目錄 開篇:為什么登錄系統這么重要?整體架構設計核心功能模塊安全設計要點技術實現細節性能優化策略總結與展望 開篇:為什么登錄系統這么…