JS紅寶書筆記 8.2 創建對象

雖然使用Object構造函數或對象字面量可以方便地創建對象,但這些方式有明顯不足:創建具有同樣接口的多個對象需要重復編寫很多代碼

工廠模式可以用不同的參數多次調用函數,每次都會返回一個新對象,這種模式雖然可以解決創建多個類似對象的問題,但沒有解決對象表示問題,即新創建的對象是什么類型

構造函數和工廠函數的區別:

  • 沒有顯式的創建對象
  • 屬性和方法字節賦值給了this
  • 沒有return

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

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

constructor本來是用于標識對象類型的,不過,一般認為instanceof操作符是確定對象類型更可靠的方式

相比于工廠模式,定義自定義構造函數可以確保實例被標識為特定類型。

構造函數不一定要寫成函數聲明的形式,賦值給變量的函數表達式也可以表示構造函數,在實例化時,如果不想傳參數,那么構造函數后面的括號可加可不加。只要有new操作符,就可以調用相應的構造函數

構造函數與普通函數唯一的區別就是調用方式不同,除此之外,構造函數也是函數,并沒有把某個函數定義為構造函數的特殊語法。任何函數只要使用new操作符調用就是構造函數,而不是用new操作符調用的函數就是普通函數。

構造函數的主要問題在于,其定義的方法會在每個實例上都創建一遍,因為都是做一樣的事,所以沒必要定義兩個不同的Function實例,況且,this對象可以把函數與對象的綁定推遲到運行時


每個函數都會創建一個prototype屬性,這個屬性是一個對象,包含應該由特定引用類型的實例共享的屬性和方法。實例上,這個對象就是通過調用構造函數創建的對象的原型,使用原型對象的好處是,在它上面定義的屬性和方法可以被對象實例共享。原來在構造函數中直接賦給對象實例的值,可以直接賦值給它們的原型

無論何時,只要創建一個函數,就會按照特定的規則為這個函數創建一個prototype屬性指向原型對象,默認情況下,所有原型對象自動獲得一個名為constructor的屬性,指回與之關聯的構造函數。

在自定義構造函數時,原型對象默認只會獲得constructor屬性,其他的所有方法都繼承自Object,每次調用構造函數創建一個新實例,這個實例的內部[[Prototype]]指針就會被賦值為構造函數的原型對象。腳本中沒有訪問這個[[Prototype]]的標準方式,一些瀏覽器會在每個對象上暴露__proto__屬性,通過這個屬性可以訪問對象的原型。

實例與構造函數原型之間有直接的聯系,但實例與構造函數之間沒有

雖然不是所有實現都對外暴露了[[Prototype]],但可以使用isPrototypeOf()方法確定兩個對象之間的關系,isPrototypeOf()會在傳入參數的[[Prototype]]指向調用它的對象時返回true

Object有一個方法叫Object.getPrototype(),返回參數的內部特性[[Prototype]]的值

Object.setPrototypeOf()可以向實例的私有特性[[Prototype]]寫入一個新值,這樣就可以重寫一個對象的原型繼承關系,但是會影響代碼性能

Object.create()可以創建一個新對象,同時為其指定原型

原型層級

在通過對象訪問屬性時,會按照這個屬性的名稱開始搜索,搜索開始于對象實例本身,如果在這個實例上發現了給定的名稱,則返回該名稱對應的值,如果沒有找到這個屬性,則搜索會沿著指針進入原型對象,然后在原型對象上找到屬性后,再返回對應的值,這就是原型用于在多個對象實例間共享屬性和方法的原理

雖然可以通過實例讀取原型對象上的值,但不能通過實例重寫這些值,如果在實例上添加了一個原型對象中同名的屬性,那就會在實例上創建這個屬性,這個屬性會遮住原型對象上的屬性。

使用delete操作符可以刪除實例上的屬性

hasOwnProperty()方法用于確定某個屬性是在實例上還是在原型對象上,這個方法是繼承自Object的,會在屬性存在于調用它的對象實例上時返回true

原型和in操作符

有兩種方式使用in操作符:單獨使用和在for-in循環中使用

在單獨使用時,in操作符會在可以通過對象訪問指定屬性時返回true,無論該屬性在實例上還是原型上。

如果要確定某個屬性是否在原型上,可以同時使用hasOwnProperty()和in操作符

在for-in循環中使用in操作符時,可以通過對象訪問且可以被枚舉的屬性都會返回,包括實例和原型屬性

要獲得對象上所有可枚舉的實例屬性,可以使用Object.keys()方法,這個方法接收一個對象作為參數,返回包含該對象所有可枚舉屬性名稱的字符串數組

如果想列出所有實例屬性,無論是否可以枚舉,都可以使用Object.getOwnPropertyNames()

Object.getOwnPropertySymbols()方法針對符號

屬性枚舉順序

for-in循環和Object.keys()的枚舉順序是不確定的

Object.getOwnPropertyNames()、Object.getOwnPropertySymbols()和Object.assign()的枚舉順序是確定的,先以升序枚舉數值鍵,然后以插入順序枚舉字符串和符號鍵,在對象字面量中定義的鍵以它們逗號分隔的順序插入


Object.values()和Object.entries()將對象內容轉換為序列化的,可迭代的格式,它們接收一個對象,返回它們內容的數組。Object.values()返回對象值的數組,Object.entries()返回鍵值對的數組,非字符串屬性會被轉換為字符串輸出,這兩個方法執行對象的淺復制,符號屬性會被忽略

原型上搜索值是動態的,所以即使實例在修改原型之前已經存在,任何時候對原型對象的修改也會在實例上反映出來

實例的[[Prototype]]指針是在調用構造函數時自動賦值的,這個指針即使把原型修改為不同的對象也不會變,重寫整個原型會切斷最初原型與構造函數的聯系,但實例引用的仍然是最初的原型

重寫構造函數上的原型之后再創建的實例才會引用新的原型

通過原生對象的原型可以取得所有默認方法的引用,也可以給原生類型的實例定義新的方法。可以像修改自定義對象原型一樣修改原生對象原型,因此隨時可以添加方法

原型模式弱化了向構造函數傳遞初始化參數的能力,會導致所有實例默認都取得相同的屬性值,原型的最主要問題是它的共享特性

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

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

相關文章

高通camx hal進程dump日志分析三:Pipeline DumpDebugInfo原理分析

【關注我,后續持續新增專題博文,謝謝!!!】 上一篇我們講了: 這一篇我們開始講: 目錄 一、問題背景 二、DumpDebugInfo原理 2.1:我們分析下代碼 2.2 :Pipeline Dump debug info 2.3 :dump Metadata Pending Node信息 2.4 :Dump Metadata Pool Debug信息 2.5 :No…

【數據結構】_二叉樹基礎OJ

目錄 1. 單值二叉樹 1.1 題目鏈接與描述 1.2 解題思路 1.3 程序 2. 相同的樹 2.1 題目鏈接與描述 2.2 解題思路 2.3 程序 3. 對稱二叉樹 3.1 題目鏈接與描述 3.2 解題思路 3.3 程序 1. 單值二叉樹 1.1 題目鏈接與描述 題目鏈接: 965. 單值二叉樹 - 力…

軟件工程畫圖題

目錄 1.大綱 2.數據流圖 3.程序流圖 4.流圖 5.ER圖 6.層次圖 7.結構圖 8.盒圖 9.狀態轉換圖 10.類圖 11.用例圖 12.活動圖 13.判定表和判定樹 14.基本路徑測試過程(白盒測試) 15.等價類劃分(黑盒測試) 1.大綱 (1).數據流圖 (2).程序流圖 (3).流圖 (4).ER圖…

H7-TOOL自制Flash讀寫保護算法系列,為華大電子CIU32F003制作使能和解除算法,支持在線燒錄和脫機燒錄使用2025-06-20

說明: 很多IC廠家僅發布了內部Flash算法文件,并沒有提供讀寫保護算法文件,也就是選項字節算法文件,需要我們制作。 實際上當前已經發布的TOOL版本,已經自制很多了,比如已經支持的兆易創新大部分型號&…

go channel用法

介紹 channel 在 Go 中是一種專門用來在 goroutine 之間傳遞數據的類型安全的管道。 你可以把它理解成: 多個 goroutine 之間的**“傳話筒”**,誰往通道里塞東西,另一個 goroutine 就能接收到。 Go 語言采用 CSP(Communicatin…

openLayers切換基于高德、天地圖切換矢量、影像、地形圖層

1、需要先加載好地圖,具體點此鏈接 openLayers添加天地圖WMTS、XYZ瓦片服務圖層、高德地圖XYZ瓦片服務圖層-CSDN博客文章瀏覽閱讀31次。本文介紹了基于OpenLayers的地圖交互功能實現,主要包括以下內容: 地圖初始化:支持天地圖XYZ…

springMVC-15 異常處理

異常處理-基本介紹 基本介紹 1.Spring MVC通過HandlerExceptionResolver處理程序的異常,包括Handler映射、數據綁定以及目標方法執行時發生的異常。 2.主要處理Handler中用ExceptionHandler注解定義的方法。 3.ExceptionHandlerMethodResolver內部若找不到Excepti…

視頻匯聚EasyCVR平臺v3.7.2發布:新增全局搜索、播放器默認解碼方式等4大功能

EasyCVR視頻匯聚平臺帶著全新的v3.7.2版本重磅登場!此次升級,絕非簡單的功能堆砌,而是從用戶體驗、操作效率以及系統性能等多維度進行的深度優化與革新,旨在為大家帶來更加強大、穩定且高效的視頻監控管理體驗。 一、全局功能搜索…

三、kubectl使用詳解

三、kubectl使用詳解 文章目錄 三、kubectl使用詳解1、常用基礎命令1.1 Kubectl命令格式1.2 查詢一個資源1.3 創建一個資源1.4 修改一個資源1.5 刪除一個資源1.6 其他 2、K8s隔離機制Namespace(命名空間作用及使用)2.1 什么是命名空間2.2 命名空間主要作…

JVM內存模型詳解

JVM內存模型詳解 Java虛擬機(JVM)內存模型是理解Java程序運行機制的核心,它定義了程序運行時數據的組織方式和訪問規則。與Java內存模型(JMM)關注并發不同,JVM內存模型主要描述運行時數據區的結構和功能。 一、JVM內存模型概述 JVM內存模型將運行時數…

《對話式 AI 白皮書》共創者招募

在 AI Agent 技術不斷演變的當下,共創一本不斷演變的對話式 AI 白皮書,共同探索人機對話的新紀元。無論你是開發者、技術專家、生態伙伴還是創業者,都期待你的加入。 項目地址:https://github.com/RTE-Dev/book_era_convoai/ 在…

Flux功能介紹,完整使用示例,與Mono對比

以下是關于Reactor框架中Flux與Mono的功能介紹、使用示例及對比分析: Flux功能介紹 核心定義 Flux是Reactor庫中的核心接口,表示一個異步的、包含零到多個元素的序列(類似流式數據處理)[3][4][7]。它可以處理無限長度的數據流&am…

Git使用基本指南

一、Git 基礎配置 首先需要配置用戶信息,讓 Git 知道你是誰: git config --global user.name "你的名字" git config --global user.email "你的郵箱example.com" 如果需要查看配置信息,可以使用: git co…

【入門】【例17.3】 內功逼毒

| 時間限制:C/C 1000MS,其他語言 2000MS 內存限制:C/C 64MB,其他語言 128MB 難度:中等 分數:100 OI排行榜得分:12(0.1分數2難度) 出題人:root | 描述 黃蓉中了毒,在 t 時…

蘋果芯片macOS安裝版Homebrew(親測)

在Linux服務器上安裝一個軟件常用yum,apt、dnf命令,同樣macOS可以使用brew命令來安裝軟件。 brew會自動幫你下載、解壓、安裝和配置,更重要的是:它還會自動處理好軟件之間的依賴關系,它將所有軟件都安裝在獨立的統一目…

uniapp+vue3做小程序,獲取容器高度

小程序獲能用createSelectorQuery,如果是子組件,后面可以額外加一個參數in來指定獲取dom的范圍。小程序里面可以直接.in(this),但是vue3沒有this了,那就只能通過getCurrentInstance去獲取當前實例代替this ,注意這里需…

【網工】華為配置專題進階篇①

目錄 ■浮動路由和BFD配置 ▲浮動路由 基本配置示例 ▲BFD ▲驗證命令 ▲測試連通性 ■路由綜合實驗RIP OSPF BGP ■浮動路由和BFD配置 ▲浮動路由 浮動路由:設置preference 浮動路由是一種備份路由機制,當主路由失效時,浮動路由會…

DeepLegal AI:智能法律文檔審查與合規助手+MVP

1. 商業價值與市場機會 DeepLegal AI旨在革新法律行業中耗時且資源密集型的文檔審查和合規流程。該應用將利用DeepSeek先進的語言模型能力,為律師事務所、企業法務部門和合規團隊提供一個高效、準確且經濟的解決方案。 市場機會: 法律科技市場正經歷爆…

使用 Rust 編寫簡單計算器

在編程語言的世界中,Rust 以其安全性和高性能而聞名。今天,我們將通過一個簡單的項目來探索 Rust 的魅力 —— 編寫一個簡單的命令行計算器。這個計算器將支持基本的算術運算(加、減、乘、除),并且可以通過用戶輸入進行…

清華大學:《AI賦能教育 :高考志愿填報工具使用指南》下載

志愿填報的認知革命已經到來 “分數出來了,但不知道能上什么學校……” “喜歡這個專業,但不知道就業前景怎么樣?” “到底是選熱門專業還是選興趣愛好?” 這些讓百萬家庭徹夜難眠的問題,你是否正在經歷? …