創建對象

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

1.工廠模式?

工廠模式是一種眾所周知的設計模式,廣泛應用于軟件工程領域,用于抽象創建特定對象的過程?

function createPerson(name,age){let o=new Object();?o.name=name;?o.age=age;?o.sayName=function(){console.log(this.name);};return o;}let person1=createPerson('a',18);let person2=createPerson('b',19)

可以根據用不同的參數多次調用這個函數,每次都會返回2個屬性和1個方法的對象,這種工廠模式雖然可以解決多個類似對象的問題,但沒有解決對象標識問題(即新創建的對象是什么類型),每次創建對象的時候方法都會創建??

2.構造函數模式?

//第一種寫法  
function Person(name,age){this.name=name; this.age=age; this.sayName=function(){console.log(this.name) };
}let person1=new Person("Nicholas",29);
let person2=new Person('b',27)//第二種寫法 
let Person =function(name,age,job){this.name=name; this.age=age; this.sayName=function(){console.log(this.name) };
}//不傳參數
function Person(){this.name="JaKe"; this.sayName=function(){console.log(this.name) };
}
let person1=new Person(); 
let Person2=new Person; 

Person()構造函數代替了createPerson()工廠函數,實際上Person()內部的代碼跟createPerson()基本是一樣的,只是有如下區別?

  • 沒有顯式地創建對象
  • 屬性和方法直接復制給了this?
  • 沒有return?

另外要注意按照慣例構造函數名稱的首字母要大寫,非構造函數則以小寫字母開頭,有助于區分構造函數和普通函數?

1.要創建Person的實例,應使用new操作符,使用new操作符會執行如下操作
  1. 在內存中創建一個新對象
  2. 這個新對象內部的[[prototype]]特性被賦值為構造函數的prototype屬性?
  3. 構造函數內部的this被賦值為這個新對象(即this指向新對象)
  4. 執行構造函數內部的代碼(給新對象添加屬性)
  5. 如果構造函數返回非空對象,則返回該對象;否則,返回剛創建的新對象?

上個例子,person1和person2分別保存著Person的不同實例,這兩個對象都有一個construcotr屬性指向Person,如下所示?

conosle.log(person1.constructor==Person); //true??

console.log(person2.constructor==Person); //true?

instanceof操作符? 用于判斷一個對象是否是某個構造函數的實例?

console.log(person1 instanceof Object) //true? ?因為Person1是通過構造函數Person創建的,而Person.prototype最終繼承自object.prototype 換句話說,所有對象的原型鏈最終都會指向Object.prototype?


console.log(person1 instanceof Person)?

2.1構造函數也是函數?

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

//作為構造函數

let person=new Person('a',17)

person.sayName();?


//作為函數調用

Person("Greg",27); //添加到window對象?

window.sayName(); //"Greg"

//在領一個對象的作用域中調用

let o = new Object( );?

Person.call(o,'Kristen',25)

o.sayName(); //"Kristen"?

2.2? 構造函數的問題

構造函數雖然有用,但也不是沒有問題,構造函數的主要問題在于,其定義的方法會在每個實例上都創建一遍,因此對前面的例子而言,person1和person2都有名為sayName()的方法,但這兩個方法不是同一個Funtion實例,我們知道,js中的函數是對象,因此每次定義函數時,都會初始化一個對象

conosle.log(person1.sayName==person2.sayName); //false?

雖然可以把函數轉移到構造函數外部,但是這樣會搞亂全局作用域,這個新問題可以通過原型模式來解決?

3. 原型模式 (請看下面這篇文章)

js對象原型,原型鏈-CSDN博客

4.屬性枚舉順序

for-in循環,Object.keys(),Object.getOwnPropertyNames(),Object.getOwnProperty-Symbols()以及Object.assign()在屬性枚舉順序方面有很大區別,for-in循環和Object.keys()的枚舉順序是不確定的取決于js引擎,可能因瀏覽器而異?

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

let k1 = Symbol('k1'),k2 = Symbol('k2');let o = {1: 1,first: 'first',[k1]: 'sym2',second: 'second',0: 0
};o[k2] = 'sym2';
o[3] = 3;
o.third = 'third';
o[2] = 2;console.log(Object.getOwnPropertyNames(o));
// ["0", "1", "2", "3", "first", "second", "third"]console.log(Object.getOwnPropertySymbols(o));
// [Symbol(k1), Symbol(k2)]

5. 對象迭代?

1.Object.values() //返回對象值的數組
2. Object.entries() //返回健/值對的數組?
const o = {foo: 'bar',baz: 1,qux: {}
};console.log(Object.values(o));
// ["bar", 1, {}]console.log(Object.entries((o)));
// [["foo", "bar"], ["baz", 1], ["qux", {}]]注意: 非字符串屬性會被轉換為字符串輸出,另外,這兩個方法執行對象的淺復制: const o = {qux: {}
};console.log(Object.values(o)[0] === o.qux);
//true console.log(Object.entries(o)[0][1]=== o.qux); 
//true 符號屬性會被忽略: 
const sym=Symbol(); 
const o={[sym]: 'foo'
}; 
console.log(Object.values(o));
// []
console.log(Object.entries((o)));
// []

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

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

相關文章

深度理解指針(2)

🎁個人主頁:工藤新一 🔍系列專欄:C面向對象(類和對象篇) 🌟心中的天空之城,終會照亮我前方的路 🎉歡迎大家點贊👍評論📝收藏?文章 深入理解指…

數據科學和機器學習的“看家兵器”——pandas模塊 之一

目錄 pandas 模塊介紹 4.1 pandas 數據結構 一、課程目標 二、Series 對象介紹 三、DataFrame 對象介紹 四、Series 和 DataFrame 在具體應用中的注意事項 (一)Series 注意事項 (二)DataFrame 注意事項 五、實戰案例 案例 1:學生成績分析 案例 2:銷售數據分析 案例 3:股…

STM32CubeMX HAL庫 串口的使用

1.配置 2.開啟中斷后,生成代碼 3.串口的接收 1).開啟空閑中斷接收 __HAL_UART_ENABLE_IT(huart, UART_IT_IDLE); // 關鍵步驟:啟用空閑中斷 2). 啟動接收 調用 HAL_UARTEx_ReceiveToIdle_IT 啟動異步接收,可以使用…

IIS服務器URL重寫配置完整教程

1.下載URL Rewrite Module 2.1 https://www.iis.net/downloads/microsoft/url-rewrite https://download.microsoft.com/download/1/2/8/128E2E22-C1B9-44A4-BE2A-5859ED1D4592/rewrite_amd64_zh-CN.msi 2.安裝

vite+vue建立前端工程

? 參考 開始 | Vite 官方中文文檔 VUE教程地址 https://cn.vuejs.org/tutorial/#step-1 第一個工程 https://blog.csdn.net/qq_35221977/article/details/137171497 腳本 chcp 65001 echo 建立vite工程 set PRO_NAMEmy-vue-appif not exist %PRO_NAME% (call npm i…

負進制轉換

當一個數的基數是負數時,將這個數轉換為負進制數時,大體思路和正數的情況一樣,但是因為基數是負數,所以計算出來的余數就有可能是負數所以,需要在余數是負數時:將余數 基數的絕對值,商 1。 代…

K8S已經成為了Ai應用運行的平臺工具

AI應用與K8s的深度融合:加速云原生時代的智能運維與業務創新 摘要: 隨著人工智能(AI)技術的飛速發展,Kubernetes(K8s)作為容器編排領域的領軍者,正逐步成為承載AI應用的核心基礎設施…

NVMe簡介1

它分為兩部分,這里是第一部分。 NVM Express(NVMe)是一種高性能、可擴展的接口協議,用于通過PCI express(PCIe)總線,實現主機軟件與NVM設備之間的通信。目前,由于NVMe SSD相比于SATA…

微服務商城(1)開篇、服務劃分

參考:https://mp.weixin.qq.com/s?__bizMzg2ODU1MTI0OA&mid2247485597&idx1&sn7e85894b7847cc50df51d66092792453&scene21#wechat_redirect 為什么選擇go-zero go-zero 為我們提供了許多高并發場景下的實用工具,比如為了降低接口耗時…

《隱私計算:數據安全與隱私保護的新希望》

一、引言 在數字化時代,數據已成為企業和組織的核心資產。然而,數據的收集、存儲和使用過程中面臨著諸多隱私和安全挑戰。隱私計算作為一種新興技術,旨在解決數據隱私保護和數據共享之間的矛盾。本文將深入探討隱私計算的基本概念、技術原理、…

MySQL 學習(九)bin log 與 redo log 的區別有哪些,為什么快速恢復使用 redo log 而不用 bin log?

目錄 一、bin log 與 redo log 的區別1)實現方式不同:2)日志內容不同:3)記錄方式不同:4)使用場合不同: 二、為什么快速恢復使用 redo log 而不用 bin log? 面試題&#x…

用Array.from實現創建一個1-100的數組

一、代碼實現 let arr Array.from({length: 100}, (_, i) > i 1); 二、代碼分析 1、Array.from(arrayLike, mapFn) (1)arrayLike 類數組對象(如 { length: 100 })本身沒有索引屬性(如 0: undefined, 1: undefi…

javaScript簡單版

簡介 JavaScript(簡稱:JS)是一門跨平臺、面向對象的腳本語言,是用來控制網頁行為,實現頁面的交互效果。 JavaScript和Java是完全不同的語言,不論是概念還是設計。但是基礎語法類似。 組成: ECMAScript:規定了JS基礎語法核心知…

Python刷題練習

文章目錄 1.尋找相同字串2.密鑰格式化3.五鍵鍵盤的輸出4.單詞重量5.輸出指定字母在字符串的中的索引6.污染水域7.九宮格按鍵輸入8.任務最優調度9.高效的任務規劃 1.尋找相同字串 題目描述: 給你兩個字符串t和p,要求從t中找到一個和p相同的連續子串,并輸…

MATLAB實現振幅調制(AM調制信號)

AM調制是通信專業非常重要的一個知識點。今天我們使用MATLAB編程實現AM調制。 我們實現輸入一個載波信號的頻率與調制信號的頻率后,再輸入調幅度,得到已調信號的波形與包絡信號的波形,再使用FFT算法分析出已調信號的頻譜圖。 源代碼&#x…

JJJ:linux ida

文章目錄 1.總結2.各類函數2.1 分配一個倉庫2.2 銷毀倉庫2.3 從倉庫里面分配一個整數id2.4 將上面分配的整數id從倉庫里面刪除2.5 在指定范圍內分配一個id 1.總結 ida使用起來很簡單,就是先分配一個倉庫一樣的實例,再從這個倉庫里面分配一個獨一無二的整…

FastByteArrayOutputStream和ByteArrayInputStream有什么區別

FastByteArrayOutputStream 和 ByteArrayInputStream 是兩種完全不同的 Java I/O 類,它們的主要區別體現在 設計目的 和 使用場景 上。以下是詳細對比: 1. 核心區別總結 特性FastByteArrayOutputStream (Spring框架)ByteArrayInputStream (JDK原生)所屬…

docker-compose——安裝redis

文章目錄 一、編寫docker-compose.yaml文件二、編寫redis.conf文件三、啟動docker-compose 一、編寫docker-compose.yaml文件 version: 3.3 services:redis:image: redis:latestcontainer_name: redisrestart: alwaysports:- 6379:6379volumes:- ./redis/data:/data- ./redis/…

東芝推出新的SCiB模塊,散熱性能加倍,適用于電動公交車、電動船舶和固定應用

東京—東芝公司推出了一種新的SCiB模塊,這是一種專為電動汽車、電動船舶和固定應用而設計的鋰離子電池。新產品采用鋁制底板,散熱量約為當前模塊的兩倍。它將于2025年4月中旬在日本和全球上市。 鋰離子電池的使用越來越多,而且越來越多樣化&a…

【進程控制二】進程替換和bash解釋器

【進程控制二】進程替換 1.exec系列接口2.execl系列2.1execl接口2.2execlp接口2.3execle 3.execv系列3.1execv3.2總結 4.實現一個bash解釋器4.1內建命令 通過fork創建的子進程,會繼承父進程的代碼和數據,因此本質上還是在執行父進程的代碼 進程替換可以將…