JavaScript進階(7) ----構造函數和原型對象

目錄

構造函數

prototype

定義:

使用場景:

constructor

使用場景:

原型proto

原型鏈

定義

特點

instanceof 運算符

原型繼承的基本概念


在JavaScript中,構造函數和原型是面向對象編程的核心概念,它們共同構成了JavaScript對象的創建和繼承機制。

構造函數

構造函數是一種特殊的函數,用于創建和初始化對象。當你想要創建一個具有特定屬性和方法的對象時,你可以定義一個構造函數。構造函數通常以大寫字母開頭,以區分普通函數。

  // 1. 構造函數實現封裝,封裝人的姓名、年齡和 sayHi方法function Person(name, age) {this.name = namethis.age = agethis.sayHi = function () {console.log('hi~')}}// 實例化const zs = new Person('張三', 18)const ls = new Person('李四', 19)console.log(zs)console.log(ls)console.log(zs === ls)  // false // 2. 構造函數實現封裝有個小問題console.log(zs.sayHi === ls.sayHi)  // false 兩個函數不一樣

prototype

定義:

構造函數通過原型分配的函數是所有對象所共享的。JavaScript 規定,每一個構造函數都有一個?prototype屬性,指向另一個對象。注意這個?prototype?就是一個對象,這個對象的所有屬性和方法,都會被構造函數所擁有。

使用場景:

可以解決:構造函數封裝時函數(方法)會多次創建,占用內存的問題

原型對象可以掛載函數,對象實例化不會多次創建原型對象里面的函數,節約內存

<body><script>// 1. 構造函數實現封裝,封裝人的姓名、年齡和 sayHi方法
?function Person(name, age) {this.name = namethis.age = age// this.sayHi = function () {// ? console.log('hi~')// }}Person.prototype.sayHi = function () {console.log('hi~')}console.log(Person.prototype) ?// 原型對象// 實例化const zs = new Person('張三', 18)const ls = new Person('李四', 19)zs.sayHi()ls.sayHi()// console.log(zs)// console.log(ls)
?// 構造函數實現封裝有個小問題console.log(zs.sayHi === ls.sayHi) ?//  true
?
?</script>
</body>

構造函數和原型對象中的this 都指向實例化的對象

  // 1. 構造函數this指向 實例對象function Person(name, age) {this.name = name}// 2. 原型對象this指向 實例對象Person.prototype.sayHi = function () {console.log('hi~')console.log(this)  // 指向實例對象 zs}const zs = new Person('張三')zs.sayHi()

constructor

每個原型對象里面都有個constructor 屬性(constructor 構造函數)

作用:該屬性指向該原型對象的構造函數, 簡單理解,就是指向我的爸爸,我是有爸爸的孩子

使用場景:

如果有多個對象的方法,我們可以給原型對象采取對象形式賦值.

但是這樣就會覆蓋構造函數原型對象原來的內容,這樣修改后的原型對象 constructor 就不再指向當前構造函數了

此時,我們可以在修改后的原型對象中,添加一個 constructor 指向原來的構造函數。

<body><script>// constructor屬性function Person(name) {this.name = name}
?// 1. constructor屬性在原型對象里面// console.log(Person.prototype)
?// 2.  constructor屬性 指向原型對象的構造函數console.log(Person.prototype.constructor === Person) ?// true
?// 3. 有什么使用場景呢?// Person.prototype.sing = function () {// ? console.log('我會唱歌')// }// Person.prototype.dance = function () {// ? console.log('我會跳舞')// }
?// console.log(Person.prototype)
?Person.prototype = {// 手動指定一個constructor 指回構造函數constructor: Person,sing() {console.log('我會唱歌')},dance() {console.log('我會跳舞')}}console.log(Person.prototype)
?</script>
</body>

原型proto

對象都會有一個屬性 proto 指向構造函數的prototype 原型對象

之所以我們對象可以使用構造函數 prototype 原型對象的方法,就是因為對象有 proto 原型的存在

<body><script>// 構造函數function Person(name) {this.name = name}
?// 1. 實例對象里面有 __proto__ 屬性const zs = new Person('張三')console.log(zs)
?// 2.  __proto__ 指向原型對象 console.log(zs.__proto__ === Person.prototype) ?// true
?// 3. 注意事項// 3.1 prototype 原型對象 ?  __proto__ 原型// 3.2 __proto__ 非標準屬性,在現代瀏覽器里面顯示的是 [[Prototype]] 但是他們是等價的// 3.3 __proto__ 盡量不要修改它,否則會影響性能
?</script>
</body>

原型鏈

定義

當你訪問一個對象的屬性時,JavaScript 引擎會首先在對象自身查找該屬性,如果沒有找到,它會沿著原型鏈向上查找,直到找到該屬性或者到達原型鏈的末端(通常是一個空對象)。這個機制允許對象繼承屬性。

特點

①當訪問一個對象成員(屬性/方法)時,首先查找這個對象自身有沒有該成員(屬性/方法)

②如果沒有就查找它的原型對象(也就是 proto指向的 prototype 原型對象)

③如果還沒有就查找原型對象的原型對象(Object的原型對象)

④依此類推一直找到 Object 為止(null)

⑤原型鏈就在于為對象成員查找機制提供一個方向,或者說一條路線

<body><script>// __proto__屬性鏈狀結構稱為原型鏈// Person構造函數function Person(name) {this.name = name}// 1. 實例對象const zs = new Person('張三')zs.sayHi = function () {console.log('實例對象的方法')}// zs.sayHi()// 2. Person 原型對象Person.prototype.sayHi = function () {console.log('Person原型對象的方法')}// zs.sayHi()// 3. Ojbect 原型對象Object.prototype.sayHi = function () {console.log('Object原型對象的方法')}// zs.sayHi()// 4. nullzs.sayHi()// console.log(zs.sayHi)  // undefined</script>
</body>

instanceof 運算符

用來檢測構造函數.prototype 是否存在于實例對象的原型鏈上

<body><script>// instanceof 運算符 // 語法:  實例對象  instanceof  構造函數// 作用: 檢測構造函數的原型對象是否在實例對象的原型鏈上// Person構造函數function Person(name) {this.name = name}function Person1(name) {this.name = name}const zs = new Person('張三')console.log(zs instanceof Person)  // trueconsole.log(zs instanceof Person1)  // false// 數組 const arr = [1, 2, 3]console.log(arr instanceof Array)  //  trueconsole.log(arr instanceof Object)  //  true console.log(arr) // __proto__console.log(arr.__proto__ === Array.prototype) // trueconsole.log(Array.prototype.__proto__ === Object.prototype) // true</script>

原型繼承的基本概念

  1. 原型對象:每個函數在創建時都會自動創建一個prototype屬性,這個屬性是一個對象,包含了該函數的所有實例共享的屬性和方法。
  2. 原型鏈:對象的[[Prototype]]屬性指向其原型對象,而原型對象本身也可能有一個[[Prototype]]屬性,指向另一個對象。這樣,對象之間形成了一條鏈式結構,這就是原型鏈。
  3. 屬性查找:當訪問一個對象的屬性或方法時,JavaScript引擎首先在對象自身查找,如果找不到,就沿著原型鏈向上查找,直到找到屬性或方法,或者到達原型鏈的末端。

<body><script>// 1. 抽取封裝 公共的屬性和方法  Person構造函數// 父級function Person() {this.eyes = 2}Person.prototype.eat = function () {console.log('我會吃飯')}console.log(new Person())console.log(new Person() === new Person())  // false// 男人構造函數function Man() {}// 女人構造函數function Woman() {}// 2. 繼承-借助于原型對象Man.prototype = new Person()Man.prototype.constructor = Manconsole.log(Man.prototype)const zs = new Man()// console.log(zs)Woman.prototype = new Person()Woman.prototype.constructor = Womanconst xl = new Woman()// console.log(xl)Woman.prototype.baby = function () {console.log('我會生孩子')}console.log(xl)console.log(zs)  // 張三沒有baby方法了</script>
</body>

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

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

相關文章

海康工業相機驅動

1.新建基于對話框的MFC程序&#xff0c;界面布局如下 2.修改控件ID&#xff0c;為控件綁定變量 3.創建全局變量&#xff0c;構造函數中初始化變量&#xff0c;初始化對話框界面&#xff0c;補齊各控件按鈕響應函數 全文程序如下&#xff1a; // MFC_GrabimageDlg.h : 頭文件 /…

【動態規劃Ⅰ】斐波那契、爬樓梯、楊輝三角

動態規劃—斐波那契系列 什么是動態規劃斐波那契數組相關題目509. 斐波那契數 Easy1137. 第 N 個泰波那契數 Easy 楊輝三角118. 楊輝三角 Easy 爬樓梯相關題目70. 爬樓梯 Easy746. 使用最小花費爬樓梯 Easy 什么是動態規劃 動態規劃是一種通過將原問題分解為相對簡單的子問題來…

linux下解壓命令

在Linux下&#xff0c;解壓縮文件通常涉及多種命令&#xff0c;具體取決于文件的壓縮格式。以下是一些常用的解壓縮命令&#xff1a; tar.gz / .tgz 如果文件擴展名為 .tar.gz 或 .tgz&#xff0c;你可以使用 tar 命令來解壓縮&#xff1a; tar -xzf filename.tar.gz這里的 -x …

近期幾首小詩匯總-生活~卷

生活 為生活飄零&#xff0c;風雨都不阻 路見盲人艱&#xff0c;為她心點燈 賀中科大家長論壇成立十五周年 科學家園有喜賀 園外丑漢翹望中 曾一學子入我科 正育科二盼長大 憧憬也能入此家 與科學家論短長 園外翹首聽高論 發現有隙入此壇 竟然也能注冊成 入園瀏覽惶然立 此貼…

系統架構的基礎:定義、原則與發展歷程

目錄 1. 系統架構的定義 2. 系統架構的基本組成部分 2.1 架構層次 2.2 架構視圖 2.3 架構原則 3. 系統架構的發展歷程 3.1 初期階段:單體架構(Monolithic Architecture) 3.2 面向對象和組件化階段 3.3 客戶端-服務器架構(Client-Server Architecture) 3.4 三層架…

在 Linux 上使用 lspci 命令查看 PCI 總線硬件設備信息

lspci 命令用于顯示 Linux 系統上的設備和驅動程序 當在個人電腦或服務器上運行 Linux 時&#xff0c;有時需要識別該系統中的硬件。lspci 命令用于顯示連接到 PCI 總線的所有設備&#xff0c;從而滿足上述需求。該命令由 pciutils 包提供&#xff0c;可用于各種基于 Linux 和…

JAVA中的回溯算法解空間樹,八皇后問題以及騎士游歷問題超詳解

1.回溯算法的概念 回溯算法顧名思義就是有回溯的算法 回溯算法實際上一個類似枚舉的搜索嘗試過程&#xff0c;主要是在搜索嘗試過程中尋找問題的解&#xff0c;當發現已不滿足求解條件時&#xff0c;就“回溯”返回&#xff0c;嘗試別的路徑。回溯法是一種選優搜索法&#xff…

E12.【C語言】練習:求兩個數的最大公約數

1.枚舉 #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> int main() {int a 0;int b 0;int tmp 0;scanf("%d %d", &a, &b);if (a < b){for (int i1; i < a; i){if (0a% i && 0b%i)tmp i;}}if (a>b){for (int i 1; i <…

[線性RNN系列] Mamba: S4史詩級升級

前言 iclr24終于可以在openreview上看預印本了 這篇&#xff08;可能是顛覆之作&#xff09;文風一眼c re組出品&#xff1b;效果實在太驚艷了&#xff0c;實驗相當完善&#xff0c;忍不住寫一篇解讀分享分享。 TL;DR &#xff08;overview&#xff09; Structured State-Sp…

Nginx 日志統計分析命令

統計訪問量最多的IP地址&#xff1a; awk {print $1} /path/to/nginx/access.log | sort | uniq -c | sort -nr | head -n 10統計不同狀態碼的出現次數&#xff1a; awk {print $9} /path/to/nginx/access.log | sort | uniq -c | sort -nr統計訪問量最多的URL&#xff1a; awk…

SQL Server端口配置指南

SQL Server是微軟推出的關系型數據庫管理系統&#xff0c;它支持多種操作系統平臺。默認情況下&#xff0c;SQL Server使用TCP/IP協議的1433端口進行通信。然而&#xff0c;出于安全或其他考慮&#xff0c;我們可能需要更改SQL Server實例的默認端口。本文將指導你如何更改SQL …

利率債與信用債的區別及其與債券型基金的關系

利率債與信用債的定義及其區別 定義 利率債&#xff1a; 定義&#xff1a;利率債是指由主權或類主權主體&#xff08;如中華人民共和國財政部、國家開發銀行等&#xff09;發行的債券。這些債券通常被認為沒有信用風險&#xff0c;因為它們由國家信用背書。特點&#xff1a;由…

【Python】 深入了解 Python 字典的 | 更新操作

我白天是個 搞笑廢物 表演不在乎 夜晚變成 憂傷怪物 撕扯著孤獨 我曾經是個 感性動物 小心地感觸 現在變成 無關人物 &#x1f3b5; 張碧晨/王赫野《何物》 Python 3.9 引入了一種新的字典更新操作&#xff0c;即使用 | 運算符合并字典。這種方式不僅簡潔…

xshell公鑰免密登錄

設備&#xff1a;一臺linux系統機器&#xff0c;一臺windows系統機器 軟件&#xff1a;xshell 要求&#xff1a;公鑰免密登錄 一、生成公鑰、私鑰 1、打開shell &#xff1b; 點擊工具 &#xff1b; 新建用戶生成密鑰向導 2、生成密鑰參數 密鑰類型&#xff1a;RS…

element ui ts table重置排序

#日常# 今天帶的實習生&#xff0c;在遇到開發過程中&#xff0c;遇到了element ui table 每次查詢的時候都需要重置排序方式&#xff0c;而且多個排序是由前端排序。 <el-table :data"tableData" ref"restTable"> </<el-table> <script…

bi項目筆記

1.bi是什么 bi項目就是商業智能系統&#xff0c;也就是數據可視畫、報表可視化系統&#xff0c;如下圖的就是bi項目了 2.技術棧

Linux rsync文件同步工具

scp的不足 1. 性能問題 單線程傳輸 SCP只使用單線程進行傳輸&#xff0c;這意味著在傳輸大文件或大量小文件時&#xff0c;其傳輸速度和效率可能不如其他多線程工具。 無法壓縮數據傳輸 SCP不支持內置的壓縮機制&#xff0c;這在傳輸大文件時會導致帶寬使用效率較低。 2.…

我花了5年時間訓練自己這種能力,希望你也能成功

人生最重要的能力是日拱一卒&#xff0c;即每天做一點點對自己有利的事并持續足夠長的時間。作者之前急于求成&#xff0c;減肥失敗。同事通過每月改進一件小事成功減肥且知識儲備豐富。作者受啟發后&#xff0c;通過走樓梯、換代糖等小改變&#xff0c;用 4 年減了 40 斤&…

Hive的基本操作(創建與修改)

必備知識 數據類型 基本類型 類型寫法字符char, varchar, string?整數tinyint, smallint, int?, bigint?小數float, double, numeric(m,n), decimal(m,n)?布爾值boolean?時間date?, timestamp? 復雜類型(集合類型) 1、數組&#xff1a;array<T> 面向用戶提供…

從頭開始搭建一套Elasticsearch集群

前言 剛開始使用ES接觸的就是rpm或者是云上提供的ES服務&#xff0c;基本上開箱即用。特別是云上的ES服務&#xff0c;開局就是集群版本&#xff0c;提供的是優化后的參數配置、開箱即匹配訪問鑒權及常用插件&#xff0c;如無特殊需要基本上屏蔽了所有細節&#xff0c;直接可投…