JS紅寶書筆記 8.4 類

與函數類型相似,定義類也有兩種主要方式:類聲明和類表達式,這兩種方式都使用class關鍵字加大括號

與函數表達式類似,類表達式在它們被求值前也不能引用,不過與函數定義不同的是,雖然函數聲明可以提升,但類定義不能,函數受函數作用域限制,而類受塊作用域限制

類可以包含構造函數方法、實例方法、獲取函數、 設置函數和靜態類方法,但這些都不是必須的,空的類定義照樣有效,默認情況下,類定義中的代碼都在嚴格模式下執行

類表達式的名稱是可選的,在把類表達式賦值給變量后,可以通過name屬性取得類表達式的名稱字符串,但不能在類表達式作用域外部訪問這個標識符


constructor關鍵字用于在類定義塊內部創建類的構造函數,方法名constructor會告訴解釋器在使用new操作符創建類的新實例時,應該調用這個函數。構造函數的定義不是必須的,不定義構造函數相當于將構造函數定義為空函數

使用new操作符實例化操作等于使用new調用其構造函數,唯一可感知的不同之處是,JS解釋器知道使用new和類意味著應該使用constructor函數進行實例化。

使用new調用類的構造函數會執行如下操作:

  • 在內存中創建一個新對象
  • 這個新對象內部的[[Prototype]]指針被賦值為構造函數的prototype屬性
  • 構造函數內部的this被賦值為這個新對象
  • 執行構造函數內部的代碼
  • 如果構造函數返回非空對象,則返回該對象,否則,返回剛創建的新對象

類實例化時傳入的參數會用作構造函數的參數,如果不需要參數,則類名后面的括號也是可選的

默認情況下,類構造函數會在執行之后返回this對象,構造函數返回的對象會被用作實例化的對象,如果沒有什么引用新創建的this對象,那么這個對象會被銷毀。如果返回的不是this對象,而是其他對象,那么這個對象不會通過instanceof操作符檢測出跟類有關聯,因為這個對象的原型指針并沒有被修改

類構造函數與構造函數的主要區別是,調用類構造函數必須使用new操作符,而普通構造函數如果不使用new調用,那么就會以全局的this作為內部對象,調用類構造函數時如果忘了使用new則會拋出錯誤

類構造函數沒有什么特殊之處,實例化之后,他會成為普通的實例方法,因此,實例化之后可以在實例上引用它,但作為類構造函數,依然要使用new調用

ES類就是一種特殊函數,類標識符有prototype屬性,而這個原型也有一個constructor屬性指向類自身

與普通構造函數一樣,可以使用instanceof操作符檢查構造函數原型是否存在于實例的原型鏈中

類本身具有與普通構造函數一樣的行為,在類的上下文中,類本身在使用new調用時就會被當成構造函數,類中定義的constructor方法不會被當成構造函數,在對它使用instanceof操作符時會返回false,但是,如果在創建實例時直接將類構造函數當成普通構造函數來使用,那么instanceof操作符的返回值會反轉

類是JS一等公民,因此可以像其他對象或函數引用一樣把類作為參數傳遞

與立即調用函數表達式類似,類也可以立即實例化


通過new調用類標識符時,都會執行類構造函數,在這個函數內部,可以為新創建的實例添加自有屬性,至于添加什么樣的屬性,則沒有限制。另外,在構造函數執行完畢后,仍然可以給實例繼續添加新成員

每個實例都對應一個唯一的成員對象,這意味著所有成員都不會在原型上共享

為了在實例間共享方法,類定義語法把在類塊中定義的方法作為原型方法。可以把方法定義在類構造函數中或者類塊中,但不能在類塊中給原型添加原始值或對象作為成員數據

類方法等同于對象屬性,因此可以使用字符串、符號或計算的值作為鍵,類定義也支持獲取和設置訪問器,語法與行為跟普通對象一樣

可以在類上定義靜態方法,這些方法通常用于執行不特定于實例的操作,也不要求存在類的實例。與原型成員類似,靜態成員每個類上只能有一個,靜態類方法非常適合作為實例工廠

靜態類成員在類定義中使用static關鍵字作為前綴,在靜態成員中,this引用類自身,其他所有約定跟原型成員一樣

雖然類定義并不顯式支持在原型或類上添加成員數據,但在類定義外部,可以手動添加

類定義語法支持在原型和類本身上定義生成器方法,因為支持生成器方法,所以可以通過添加一個默認的迭代器,把類實例變成可迭代對象


ES6類支持單繼承,使用extends關鍵字,就可以繼承任何擁有[[Constructor]]和原型的對象,很大程度上,這意味著不僅可以繼承一個類,也可以繼承普通的構造函數。派生類都會通過原型鏈訪問到類和原型上定義的方法,this的值會反映調用相應方法的實例或者類

派生類的方法可以通過super關鍵字引用它們的原型,這個關鍵字只能在派生類中使用,而且僅限于類構造函數、實例方法和靜態方法內部。在類構造函數中使用super可以調用父類構造函數

在靜態方法中可以通過super調用繼承的類上定義的靜態方法

ES6給類構造函數和靜態方法添加了內部特性[[HomeObject]],這個特性是一個指針,指向定義該方法的對象,這個指針是自動賦值的,而且只能在JS引擎內部訪問。super始終會定義為[[HomeObject]]的原型

在使用super時要注意幾個問題:

  • super只能在派生類構造函數和靜態方法中使用
  • 不能單獨引用super關鍵字,要么用它調用構造函數,要么用它引用靜態方法
  • 調用super會調用父類構造函數,并將返回的實例賦值給this
  • super的行為如同調用構造函數,如果需要給父類構造函數傳參,則需要手動傳入
  • 如果沒有定義類構造函數,在實例化派生類時會調用super,而且會傳入所有傳給派生類的參數
  • 在類構造函數中,不能在調用super之前引用this
  • 如果在派生類中顯示定義了構造函數,則要么必須在其中調用super,要么必須在其中返回一個對象

有時候可能需要定義這樣一個類,它可供其他類繼承,但本身不會被實例化。可以通過new.target實現,new.target保存通過new關鍵字調用的類或函數,通過在實例化時檢測new.target是不是抽象基類,可以阻止對抽象基類的實例化

通過在抽象基類構造函數中進行檢查,可以要求派生類必須定義某個方法,因為原型方法在調用類構造函數之前就已經存在了,所以可以通過this關鍵字來檢查相應的方法

ES6類為繼承內置引用類型提供了順暢的機制,開發者可以方便的擴展內置類型

有些內置類型的方法,會返回新實例,默認情況下,返回實例的類型與原始實例的類型是一致的,如果想覆蓋這個默認行為,則可以覆蓋Symbol.species訪問器,這個訪問器決定在創建返回的實例時使用的類

把不同類的行為集中到一個類是一種常見的JS模式,extends關鍵字后面是一個JS表達式,任何可以解析為一個類或一個構造函數的表達式都是有效的,這個表達式會在求值類定義時被求值。混入模式可以通過在一個表達式中連綴多個混入元素來實現,這個表達式最終會解析為一個可以被繼承的類。可以定義一組可嵌套的函數,每個函數分別接收一個超類作為參數,而將混入類定義為這個參數的子類,并返回這個類,這些組合函數連綴調用,最終組合成超類表達式

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

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

相關文章

專題:2025游戲科技與市場趨勢報告|附130+份報告PDF匯總下載

原文鏈接:https://tecdat.cn/?p42733 2024年全球游戲市場規模突破1877億美元,中國以37.5%的全球占比成為核心增長引擎。生成式AI以52%的企業采用率重塑開發流程,混合休閑游戲實現37%的收入增長,跨端互通產品貢獻42%增量。玩家行為…

【沉浸式解決問題】Property ‘sqlSessionFactory‘ or ‘sqlSessionTemplate‘ are required

目錄 一、問題描述二、場景還原1. 測試mapper2. 測試service 三、原因分析四、解決方案1. DemoApplicationTests2. DemoApplication 后記 一、問題描述 在Application文件中加了ComponentScan注解,此后運行任何測試方法均報錯 java.lang.IllegalStateException: Fa…

Ubuntu 和 CentOS 中配置靜態 IP

在 Ubuntu 和 CentOS 中配置靜態 IP 的方法有所不同,主要因為兩者使用的網絡管理工具不同。以下是詳細步驟: Ubuntu(18.04 及更新版本,使用 netplan) 1. 查看網卡名稱 ip a記錄網卡名稱(如 ens33、eth0&a…

4、做中學 | 二年級下期 Golang整型和浮點型

上篇介紹了哪些數據類型,如何進行聲明常量和變量,那么接下來進行詳細學習下各個數據類型的使用! 一、整數 在go中,整數分為倆類,一個是無符號整數,即0以上數值;另一個是有符號數值,…

C++11 GC Interface:從入門到精通

文章目錄 一、引言二、C11簡介2.1 C11發展歷史2.2 C11新特性概述 三、C11中的垃圾收集支持和基于可達性的泄漏檢測3.1 背景與原理3.2 相關標準與接口3.3 示例代碼 四、C11 GC interface的使用場景4.1 簡化內存管理4.2 提高代碼可靠性 五、C23中移除垃圾收集支持和基于可達性的泄…

《高并發系統性能優化三板斧:緩存 + 異步 + 限流》

高并發系統性能優化三板斧:緩存 異步 限流 引言 在互聯網應用的高并發場景下,系統性能面臨巨大挑戰。以某電商平臺會員活動為例,活動期間瞬時QPS可達10萬,若未進行有效優化,服務器將迅速崩潰。本文從緩存、異步、限…

JVM(4)——引用類型

痛點引入: 為什么需要不同的引用類型?直接只用強引用不行嗎?(內存泄漏風險、緩存管理粗粒度、對象生命周期監聽需求) 核心作用: 解釋引用類型如何讓程序員與垃圾收集器(GC)協作&…

ONLYOFFICE 文檔 9.0 版本已發布:新界面、圖表查看器、.md 文件支持、AI 表格與宏等更新

ONLYOFFICE 文檔 9.0 版本已正式發布。此次更新包含 20 多項新功能和約 500 項修復,全面提升您的辦公效率。從全新界面、突破性的 AI 工具到更廣泛的文件格式兼容性,本次發布將帶來更加流暢的使用體驗。閱讀本文,了解詳情。 更新全部編輯器的…

關于python-socket服務的問題記錄

概述 在使用pythonwebsocket部署socket服務,前端使用小程序來連接,過程中存在以下可能出現的問題: 1,代碼里socket端口問題2,服務器配置問題(域名解析?Nginx配置是否正確處理了WebSocket升級頭…

typescript vs go vs rust

typescript 后端選型: Express &Typescript &trpc 廣泛使用,靈活,快速,穩定 Nestjs 企業級,標準化,像java ,依賴注入, Hono , web standards framework. Support for any J…

OpenGL和OpenGL ES區別

OpenGL(Open Graphics Library)和OpenGL ES(OpenGL for Embedded Systems)都是用于圖形渲染的API,但它們的目標平臺和設計定位有所不同。 1. 目標平臺 OpenGL 主要用于桌面平臺(如Windows、macOS、Linux&a…

PyTorch 入門之官方文檔學習筆記(一)

目錄 1 張量 1)張量的初始化和屬性 2)張量操作 3)使用 NumPy 進行橋接 2 torch.autograd 1)背景 2)在 PyTorch 中的使用 3)Autograd 的微分機制 4)計算圖原理 5)從計算圖中…

King’s LIMS 系統引領汽車檢測實驗室數字化轉型

隨著汽車保有量的持續攀升和車齡的增長,消費者對汽車的需求已悄然轉變,從最初對外觀和性能的追求,逐漸深化為對安全性、可靠性、耐久性、性能與舒適性以及智能化功能的全方位關注。這無疑讓汽車檢測行業在保障車輛質量、滿足市場需求方面肩負…

Neo4j常見語句-merge

merge用法&#xff1a;MERGE 是 Neo4j 中一個強大的操作符&#xff0c;用于確保圖中存在特定的節點或關系。它的核心邏輯是&#xff1a;如果目標存在則匹配&#xff0c;不存在則創建 基本語法與邏輯&#xff1a; MERGE <pattern> [ON CREATE <create_clause>] //…

Mem0多級記憶實現機制詳解

在人工智能交互場景中,記憶能力是實現個性化服務與智能決策的關鍵。Mem0 通過設計分層記憶架構,實現了對用戶、會話和智能體狀態的多級管理。各層級記憶既相互獨立存儲,又通過精密的關聯機制協同運作,確保在不同場景下都能提供精準的上下文支持,顯著提升 AI 交互的智能性與…

Python 爬蟲入門 Day 5 - 使用 XPath 進行網頁解析(lxml + XPath)

Python 第二階段 - 爬蟲入門 &#x1f3af; 今日目標 掌握 XPath 的基本語法使用 lxml.etree 解析 HTML&#xff0c;提取數據與 BeautifulSoup 比較&#xff1a;誰更強&#xff1f; &#x1f4d8; 學習內容詳解 ? 安裝依賴 pip install lxml&#x1f9e9; XPath 簡介 XPa…

變幻莫測:CoreData 中 Transformable 類型面面俱到(六)

概述 各位似禿似不禿小碼農們都知道&#xff0c;在蘋果眾多開發平臺中 CoreData 無疑是那個最簡潔、擁有“官方認證”且最具兼容性的數據庫框架。使用它可以讓我們非常方便的搭建出 App 所需要的持久存儲體系。 不過&#xff0c;大家是否知道在 CoreData 中還存在一個 Transfo…

Vuex(一) —— 集中式的狀態管理倉庫

目錄 Vue組件間通信方式回顧 組件內的狀態管理流程組件間通信方式 父組件給子組件傳值 (最簡單的一種方式)子組件給父組件傳值不相關組件之間傳值其他常見方式($ref) 簡易的狀態管理方案 上面組件間通信方式的問題集中式的狀態管理方案 Vuex 什么是Vuex?什么情況下使用Vuex?…

操作系統---內存管理上

文章目錄 1. 內存的基礎知識1.1 什么是內存&#xff0c;有何作用1.2 進程運行的基本原理1.2.1 指令的工作原理1.2.2 邏輯地址 VS 物理地址 1.3 如何實現地址轉換&#xff08;邏輯 -> 物理&#xff09;1.3.1 絕對裝入1.3.2 可重定位裝入&#xff08;靜態重定位&#xff09;1.…

醫學圖像處理期末復習

目錄 考試范圍第1章 緒論1.1 數字圖像處理的概念1.2 數字圖像處理的應用領域1、醫學領域2、其他領域 1.3 數字圖像處理基礎1.4 數字圖像基礎運算 第2章 醫學圖像灰度變換與空間濾波2.1 醫學圖像灰度變換線性灰度變換非線性灰度變換 2.2 直方圖均衡化√2.3 空間平滑濾波線性空間…