js原型和類---prototype,__proto__,new,class

原型和原型鏈

在js中,所有的變量都有原型,原型也可以有原型原型最終都指向Object

什么是原型

在js中,一個變量被創建出來,它就會被綁定一個原型;比如說,任何一個變量都可以使用console.log打印,這里是調用了它的toString方法,而變量被創建后可能并沒有設置toString方法,但是它任然可以打印,這就從原型中獲取的toString方法

?所以可以得到第一點:原型可以提供方法給實例的變量,

原型也是一個對象,或者說對象可以作為原型并賦值給其他變量,這樣對象成為了變量的原型,而對象本身也有原型,此時就形成了 ‘鏈’

同樣的這個變量也是一個對象,他也可以作為其他變量的原型,這樣‘鏈’就變得更長了,但是所有的鏈都有一個最終指向(root終點)--- Object,Obejct是最原始的對象,它包含了所有js變量都共享的方法,它不再有原型屬性[[prototype]], 所以在js中一切皆對象中的對象就是指的繼承自Object

這里可以總結一下:

  • 原型是一個對象,它可以向繼承了自身的變量提供方法(屬性)
  • 變量都擁有原型,也可以成為原型,循環下去可以形成‘鏈’,
  • 鏈的最頂端是Object對象,它提供了最基本的方法

js通過原型來復用通用的方法和屬性,這樣極大的減少了變量創建的成本(減少了內存支出,原型的方法屬性都存儲在原型上,變量中不會復制過來占用內存;也不必每個對象都去書寫基本的方法),

tips:

原型鏈:就前面說到的 變量獲得原型,原型又有原型,變量又可以作為原型,這樣就形成了‘鏈’,鏈的最外層(底層),擁有最多的方法,繼承了原型鏈上所有原型的方法和屬性

prototype

在 JavaScript 中,對象有一個特殊的隱藏屬性?[[Prototype]](如規范中所命名的),它要么為?null,要么就是對另一個對象的引用。當我們從?object?中讀取一個缺失的屬性時,JavaScript 會自動從原型中獲取該屬性。這就是繼承,object也可以從中借用方法

prototype不能在變量中被直接引用,通常沒有辦法遍歷或者讀取這個屬性,所以它在控制臺的名稱有些特殊,使用[[ ]]引用,但是可以直接去調用它里面的方法,當你使用變量中不存在的屬性或者方法,此時會自動向原型中尋找,對應的屬性方法并調用,若原型鏈中沒有則返回undefined

但是也有特例,在構造函數中,可以給構造的實例添加原型屬性或方法

__proto__

這是一個過時的屬性,現在只能在瀏覽器中使用,它的作用就是指向prototype,給原型添加屬性或方法,這樣添加的原型屬性或方法會被遍歷出來(Object.keys,for in),

let animal = {eats: true
};
let rabbit = {jumps: true
};rabbit.__proto__ = animal; // 設置 rabbit.[[Prototype]] = animal

注意__proto__?與內部的?[[Prototype]]?不一樣__proto__?是?[[Prototype]]?的getter/setter;獲取和設置原型可以使用函數?Object.getPrototypeOf/Object.setPrototypeOf?來替代?__proto__?去 get/set 原型

new

當使用?new?關鍵字調用函數時,該函數將被用作構造函數。new?將執行以下操作:

  1. 創建一個空的簡單 JavaScript 對象作為實例。
  2. 如果構造函數的?prototype?屬性是一個對象,則將實例的 原型[[Prototype]] 指向構造函數的?prototype?屬性,否則實例將保持為一個普通對象,其 [[Prototype]]為?Object.prototype,?因此,通過構造函數創建的所有實例都可以訪問添加到構造函數?prototype?屬性中的屬性/對象。
  3. 使用給定參數執行構造函數,并將this指向實例
  4. 如果構造函數返回非原始值,則該返回值成為整個?new?表達式的結果。否則,如果構造函數未返回任何值或返回了一個原始值,則返回實例。(通常構造函數不返回值,但可以選擇返回值,以覆蓋正常的對象創建過程。)

?new的關鍵點在于,它新建了一個實例對象,同時引入了原型,改變了構造函數的this指向,讓實例對象成為了這個構造函數的構造結果

class

class是es6新增的語法糖,它簡化了js中構造類的步驟,隱去了對原型的操作(根本上還是原型的操作),js中的類是基于原型的,使用原型達到繼承的效果,

以下使用原型prototype和類class構建一個相同的類,

prototype.js

// 使用原型構造一個P類// 構造器,大寫開頭規范(不強制)
function P (x,y){// this指向實例,此時this不生效,構造實例后指向實例this.x = x;this.y = y;// 實例方法,此處的this指向實例,可以使用實例的屬性this.getXY = ()=>{return [this.x,this.y]}
}// 實例方法,此處的this指向windows,不能使用實例的屬性
P.prototype.getPName = ()=>{return P.name
}// 實例屬性
P.prototype.desc = '2維坐標'//類方法/靜態方法 
P.getP = (p1,p2)=>{return [p1.getXY(),p2.getXY()]
}// 類屬性/靜態屬性
P.des = '坐標'

class.js?

// 使用class構造一個P類class P{//構造器constructor(x,y){this.x = x;this.y = y;}// 實例屬性desc = '2維坐標'// 實例方法getXY(){return [this.x,this.y]}getPName(){return P.name}// 靜態屬性static des = '坐標'// 靜態方法static getP(p1,p2){return [p1.getXY(),p2.getXY()]}}

很明顯,class的用法更加整體化,但實際上這兩種的寫法效果是完成相同的,

可以使用同一串代碼來實例化這個類P

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>prototype,class</title>
</head><body><script src="class.js"></script><!-- <script src="prototype.js"></script> --><script>// new關鍵字,新建一個對象,原型指向類,獲得構造器中的this指向let p = new P(1, 2);console.log(p);console.log(p.x);console.log(p.y);console.log(p.desc);console.log(p.getXY());console.log(p.getPName());console.log(P.getP(p, p));console.log(P.des);</script>
</body></html>

實現的效果是一致的方法上略有不同,對于類的構造,關鍵在于this的指向問題,屬性和方法是掛在類名下的,還是掛在實例下的需要區分開,

掛在類下的屬性方法被稱為,類方法(屬性)或者靜態方法(屬性),通過類名引用(Math.max)

掛在實例下的屬性方法被稱為,實例方法(屬性),通過實例引用(arr.push)

總結

  • 在 JavaScript 中,所有的對象都有一個隱藏的?[[Prototype]]?屬性,它要么是另一個對象,要么就是?null
  • 通過?[[Prototype]]?引用的對象被稱為“原型”。
  • "prototype"?屬性僅當設置在一個構造函數上,并通過?new?調用時,才具有這種特殊的影響。在常規對象上,prototype?會被當成是一個普通的屬性名
  • 所以變量都通過原型/原型鏈使用共享的方法(即自身不存在,從原型/原型鏈中借用)
  • 類的使用要區分實例和靜態類,哪些方法屬性在類名下,哪些方法屬性在實例下

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

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

相關文章

PostgreSQL 中如何實現數據的增量更新和全量更新的平衡?

文章目錄 一、增量更新與全量更新的概念增量更新全量更新 二、考慮的因素1. 數據量2. 數據更改的頻率和規模3. 數據一致性要求4. 系統性能和資源利用5. 業務邏輯和流程 三、解決方案&#xff08;一&#xff09;混合使用增量更新和全量更新&#xff08;二&#xff09;使用臨時表…

暑期旅游季必備,用這款客服神器應對爆棚的客流咨詢

解決暑期旅游客流高峰問題 暑期是旅游高峰季節&#xff0c;客流量劇增&#xff0c;客戶咨詢紛至沓來。在這個時候&#xff0c;如何高效處理客戶的咨詢成為每家旅游機構和景點不可忽視的挑戰。 聊天寶快捷回復助手是一款強大的工具&#xff0c;可幫助企業在客流高峰期快速回復客…

QDataStream的尷尬

最近在編寫一個網絡功能&#xff0c;需要將一個文件內容傳遞到客戶端并將改內容以文件形式保存下來。由于文件內容是個加密文件且采用了二進制形式于是客戶端就采用了QDataStream這個對象來保存文件。粗略的測試下來沒有什么問題&#xff0c;可是在獲取寫入的文件是否發現寫入的…

MemFire Cloud: 一種全新定義后端即服務的解決方案

在這個快節奏的互聯網時代&#xff0c;開發者們最希望的就是能夠省時省力地完成項目&#xff0c;快速上線。然而&#xff0c;搭建服務、開發接口API、處理各種后端問題&#xff0c;往往讓人頭疼不已。別擔心&#xff0c;現在有了MemFire Cloud&#xff0c;一款為懶人開發者量身…

計算機性能-系統架構師(二十七)

1、計算機評價主要性能指標有 時鐘頻率、&#xff08;&#xff09;、運算精度和內存容量等。 A丟包率 B端口吞吐量 C可移植性 D數據處理速率 解析&#xff1a; 計算機評價主要指標&#xff1a;時鐘頻率&#xff0c;運算速率&#xff0c;運算精度&#xff0c;內存的存儲容量…

制作電子名片的小程序系統源碼 快速生成電子名片

在當今數字化時代&#xff0c;傳統的紙質名片已逐漸被智能電子名片所取代。電子名片小程序作為一種基于微信生態的創新名片交換方式&#xff0c;憑借其便捷性、高效性和環保性&#xff0c;成為了眾多商務人士的首選。小編分享一個制作電子名片的小程序系統源碼&#xff0c;無憂…

malloc實現原理【Liunx】

malloc實現原理 malloc是什么&#xff1f;malloc,calloc, realloc的區別malloc的實現原理malloc的兩種實現方式為什么使用brk&#xff1f;為什么使用mmap&#xff1f; malloc怎么定界的malloc分配的是虛擬內存上的空間嗎&#xff1f; malloc是什么&#xff1f; 通過malloc&…

LinK3D: Linear Keypoints Representation for 3D LiDAR Point Cloud【翻譯與解讀】

LinK3D: Linear Keypoints Representation for 3D LiDAR Point Cloud 摘要 特征提取和匹配是許多機器人視覺任務的基本組成部分&#xff0c;如 2D 或 3D 目標檢測、識別和配準。2D 特征提取和匹配已取得巨大成功。然而&#xff0c;在 3D 領域&#xff0c;當前方法由于描述性差…

MySQL零散拾遺

mysql中大小寫敏感嗎&#xff1f; MySQL數據庫默認情況下是不區分大小寫的&#xff0c;這意味著在查詢時&#xff0c;字段名和值的大小寫不會影響結果。然而&#xff0c;這種默認行為可能會根據操作系統和配置的不同而有所變化。 在某些操作系統上&#xff0c;比如Linux&…

在android13的系統中出現INSTALL_FAILED_BAD_PERMISSION_GROUP安裝失敗的問題解決

在android13的系統中&#xff0c;編譯能過&#xff0c;但是在真機運行出現無法安裝的問題的問題&#xff0c;AS中提示出現INSTALL_FAILED_BAD_PERMISSION_GROUP的問題&#xff0c;找了好多資料都沒有找到具體的解決方案&#xff0c;記錄一下 解決方法&#xff1a; 在manifest中…

初識神經網絡之我的理解

初識神經網絡之我的理解 個人理解分析一個神經網絡相關python代碼參考文檔個人理解 個人認為神經網絡是一個分類問題,即通過多維的參數通過合適的計算來得到一個確定的輸出。 在數學層面看來是從高維度的參數降維為低維度的分類的過程。至于輸出的結果如何達成我們想要的或者…

Linux操作系統安全分析與防護

Linux操作系統安全機制 Linux操作系統由于其開放源代碼和廣泛應用&#xff0c;在服務器和嵌入式系統中占有重要地位。為了確保Linux系統的安全&#xff0c;必須了解并實施一系列有效的安全機制。這些機制包括用戶身份驗證、訪問控制、數據加密、日志和審計、安全更新等。 一、…

2024前端面試題之Vue3

2024前端面試題之Vue3 在面試具有五年經驗的前端工程師時&#xff0c;對于 Vue 3 的掌握程度是一個重要的考核點。本文將提供一系列針對這一級別工程師的 Vue 3 面試題&#xff0c;并附上詳細的解析&#xff0c;幫助面試官全面評估候選人的技術實力和項目經驗。 一、Vue 3 基礎…

vscode-server安裝和部分配置

文章目錄 前言code-server安裝rpm包安裝tar.gz安裝 vscode部分配置vscode配置函數跳轉安裝插件 vscode的structurevscode的hierarchy更改顏色主題 前言 vscode確實彳亍&#xff0c;雖然我覺得Clion(c/c語言版的IDEA)更方便&#xff0c;但是畢竟我沒錢買license 這里記錄一下網…

11410-00SF 同軸連接器

型號簡介 11410-00SF是Southwest Microwave的連接器。該連接器的外殼采用優質不銹鋼&#xff0c;材質為 CRES ALLOY UNS-S303500&#xff0c;符合 ASTM-A582 標準。首先&#xff0c;不銹鋼材料經過鍛造加工&#xff0c;形成轉接器的基本形狀。然后&#xff0c;外殼進行精密的 C…

認字之 刬

chǎn 釋義 1.同“鏟”&#xff0c;鏟子。用以撮取東西的工具。 chn 釋義 1.&#xff3b;一刬&#xff3d;一概&#xff1b;一律。 刬襪 [ chǎn w ] 只穿襪子&#xff0c;不穿鞋子走路。 菩薩蠻花明月暗籠輕霧 李煜 刬襪步香階&#xff0c; 手提金縷鞋。 點絳唇蹴罷秋…

前端調用有道翻譯

有道API &#xff0c;注冊用戶信息并拿到有道翻譯的應用ID和應用密鑰 安裝 crypto-js npm install crypto-js 調用翻譯API import CryptoJS from crypto-js;export const yandex (query: any) > {let appKey ;//應用IDvar salt new Date().getTime();var curtime Mat…

CentOS7忘記root密碼無法登陸解決方法

重啟服務器&#xff0c;等到如圖下所示界面的時候&#xff0c;快速按下鍵盤的↑或者↓按鍵&#xff0c;等固定住畫面&#xff0c;然后按下e按鍵 然后按鍵盤上的↓按鍵&#xff0c;找到圖下所示的linux16開頭的那段&#xff0c;然后把光標挪到ro這里 按照圖下所示&#xff0c;把…

提供跨平臺的視覺安防解決方案,滿足不同場景的需求的智慧交通開源了。

智慧交通視覺監控平臺是一款功能強大且簡單易用的實時算法視頻監控系統。它的愿景是最底層打通各大芯片廠商相互間的壁壘&#xff0c;省去繁瑣重復的適配流程&#xff0c;實現芯片、算法、應用的全流程組合&#xff0c;從而大大減少企業級應用約95%的開發成本。用戶只需在界面上…

.net6 當連接用戶的shell斷掉后,dotnet會自動關閉,達不到長期運行的效果。.NET 進程守護

1、/etc/systemd/system/ 目錄下創建service文件 如&#xff1a;/etc/systemd/system/testDemoSer.service 2、文件內容示例&#xff1a; [Unit] DescriptiontestDemoSer running on CentOS [Service] WorkingDirectory/usr/project/iis Typesimple Userroot Grouproot Exec…