學習筆記整理-面向對象-03-構造函數

一、構造函數

1. 用new調用函數的四步走

 new 函數();
  • JS規定,使用new操作符調用函數會進行"四步走":

    • 函數體內會自動創建出一個空白對象
    • 函數的上下文(this)會指向這個對象
    • 函數體內的語句會執行
    • 函數會自動返回上下文對象,即使函數沒有return語句
  • 四步走詳解

      function fun() {this.a = 3;this.b = 5;}var obj = new fun();console.log(obj);  
    
    • 第1步:函數體內會自動創建出一個空白對象。
      obj-1.png

    • 第2步:函數的上下文(this)會指向這個對象。
      obj-2.png

    • 第3步:執行函數體中的語句
      obj-3.png

    • 第4步:函數會自動返回上下文對象,即使函數沒有return語句。
      obj-4.png

2. 構造函數

  • 用new調用一個函數,這個函數就被稱為"構造函數",任何函數都可以是構造函數,只需要用new調用它。

  • 顧名思義,構造函數用來“構造新對象”,它內部的語句將 為新對象添加若干屬性和方法,完成對象的初始化

  • 構造函數必須用new關鍵字調用,否則不能正常工作,正因 如此,開發者約定構造函數命名時首字母要大寫

  • 一個函數是不是構造函數,要看它是否用new調用,而至于名稱首字母大寫,完全是開發者的習慣約定。

  • 如果不用new調用構造函數

      function People(name, age, sex) {this.name = name;this.age = age;this.sex = sex;} People('小明', 12, '男');People('小紅', 10, '女');People('小剛', 13, '男');
    
    • 結果:都會成為全局的變量,且變量的值會依次覆蓋,就是小剛 13 男
  • 使用new構建

      function People(name, age, sex) {this.name = name;this.age = age;this.sex = sex;}var xiaoming = new People('小明', 12, '男');var xiaohong = new People('小紅', 10, '女');var xiaogang = new People('小剛', 13, '男');
    
  • 為對象添加方法

      function People(name, age, sex) { this.name = name;this.age = age;this.sex = sex;this.sayHello = function () {console.log('我是' + this.name + ',我' + this.age + '歲了');}; }var xiaoming = new People('小明', 12, '男'); var xiaohong = new People('小紅', 10, '女'); var xiaogang = new People('小剛', 13, '男'); xiaoming.sayHello();xiaohong.sayHello();xiaogang.sayHello();    
    
  • 構造函數中的this不是函數本身

3. 類和實例

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-1cNSmlDn-1692020300179)(https://raw.githubusercontent.com/yangdong520/drawing-bed-workspace/main/js/obj-5.png)]

  • Java、C++等是"面向對象"(object-oriented)語言。
  • JavaScript是"基于對象"(object-based)語言。
  • JavaScript中的構造函數可以類比于OO語言中的"類", 寫法的確類似,但和真正OO語言還是有本質不同
    JS和其他OO語言完全不同的、特有的原型特性。

4. prototype和原型鏈查找

  • 什么是prototype

    • 任何函數都有prototype屬性,prototype是英語"原型"的意思。
    • prototype屬性值是個對象,它默認擁有constructor屬性指回函數
      obj-7
    • 普通函數來說的prototype屬性沒有任何用處,而構造函數的prototype屬性非常有用。
    • 構造函數的prototype屬性是它的實例的原型
  • 構造函數的prototype是實例的原型
    obj-8

    <!DOCTYPE html>
    <html lang="en">
    <head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title>
    </head>
    <body><script>function People(name, age, sex) {this.name = name;this.age = age;this.sex = sex;}// 實例化var xiaoming = new People('小明', 12, '男');// 測試三角關系是否存在console.log(xiaoming.__proto__ === People.prototype);</script>
    </body>
    </html>
    
  • 原型鏈查找

    • 每個對象都可以有一個原型_proto_,這個原型還可以有它自己的原型,以此類推,形成一個原型鏈。
      查找特定屬性的時候,先去這個對象里去找,如果沒有的話就去它的原型對象里面去,如果還是沒有的話再去向原型對象的原型對象里去尋找…
      這個操作被委托在整個原型鏈上,這個就是我們說的原型鏈了。

    • JavaScript規定:實例可以打點訪問它的原型的屬性和方法,這被稱為"原型鏈查找"。

          function People(name, age, sex) {this.name = name;this.age = age;this.sex = sex;}People.prototype.nationality = '中國';var xiaoming = new People('小明', 12, '男');console.log(xiaoming.nationality);
      
      • People.prototype.nationality在構造函數的prototype上添加nationality屬性。
      • xiaoming.nationality實例可以打點訪問原型的屬性和方法。
        [外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-19GzAMjt-1692020300180)(https://raw.githubusercontent.com/yangdong520/drawing-bed-workspace/main/js/obj-9.png)]
    • 原型的遮蔽效應

          function People(name, age, sex) {this.name = name;this.age = age;this.sex = sex;
      }
      // 往原型上添加nationality屬性
      People.prototype.nationality = '中國';// 實例化
      var xiaoming = new People('小明', 12, '男');
      var tom = new People('湯姆', 10, '男');
      tom.nationality = '美國';console.log(xiaoming.nationality);      // 中國
      console.log(xiaoming);console.log(tom.nationality);           // 美國
      //tom本身有nationality時,就不找原型上的nationality屬性了,原型鏈的遮蔽效應
      //跟局部變量全局變量差不多
      

      obj-10

    • hasOwnProperty方法可以檢查對象是否真正"自己擁有"某屬性或者方法。

          xiaoming.hasOwnProperty('name'); // truexiaoming.hasOwnProperty('age');  // truexiaoming.hasOwnProperty('sex');  // truexiaoming.hasOwnProperty('nationality'); // false
      
    • in運算符只能檢查某個屬性或方法是否可以被對象訪問,不能檢查是否是自己的屬性或方法。

          'name' in xiaoming  // true'age' in xiaoming   // true'sex' in xiaoming   // true'nationality' in xiaoming  // true

5. 在prototype上添加方法

  • 把方法直接添加到實例身上的缺點:每個實例和每個實例的方法函數都是內存中不同的函數,造成了內存的浪費
  • 解決方法:將方法寫到prototype上
    [外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-KfgSpKFg-1692020300180)(https://raw.githubusercontent.com/yangdong520/drawing-bed-workspace/main/js/obj-11.png)]

6. 原型鏈的終點

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-YC2Sl5h4-1692020300180)(https://raw.githubusercontent.com/yangdong520/drawing-bed-workspace/main/js/obj-12.png)]

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title>
</head>
<body><script>function People(name, age) {this.name = name;this.age = age;}var xiaoming = new People('小明', 12);console.log(xiaoming.__proto__.__proto__ === Object.prototype);     // trueconsole.log(Object.prototype.__proto__);                            // nullconsole.log(Object.prototype.hasOwnProperty('hasOwnProperty'));     // trueconsole.log(Object.prototype.hasOwnProperty('toString'));           // true</script>
</body>
</html>
  • 關于數組的原型鏈
    array

    <!DOCTYPE html>
    <html lang="en">
    <head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title>
    </head>
    <body><script>var arr = [344, 45, 34, 23];console.log(arr.__proto__ === Array.prototype);                 // trueconsole.log(arr.__proto__.__proto__ === Object.prototype);      // trueconsole.log(Array.prototype.hasOwnProperty('push'));            // trueconsole.log(Array.prototype.hasOwnProperty('splice'));          // true</script>
    </body>
    </html>
    

6. 繼承

  • JavaScript中如何實現繼承?

    • 實現繼承的關鍵在于:子類必須擁有父類的全部屬性和方法,同時子類還應該能定義自己特有的屬性和方法。
    • 使用JavaScript特有的原型鏈特性來實現繼承,是普遍的做法
  • 通過原型鏈實現繼承
    array
    array

    <!DOCTYPE html>
    <html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title>
    </head><body><script>// 父類,人類function People(name, age, sex) {this.name = name;this.age = age;this.sex = sex;}People.prototype.sayHello = function () {console.log('你好,我是' + this.name + '我今年' + this.age + '歲了');};People.prototype.sleep = function () {console.log(this.name + '開始睡覺,zzzzz');};// 子類,學生類function Student(name, age, sex, scholl, studentNumber) {this.name = name;this.age = age;this.sex = sex;this.scholl = scholl;this.studentNumber = studentNumber;}// 關鍵語句,實現繼承Student.prototype = new People();Student.prototype.study = function () {console.log(this.name + '正在學習');}Student.prototype.exam = function () {console.log(this.name + '正在考試,加油!');}// 重寫、復寫(override)父類的sayHelloStudent.prototype.sayHello = function () {console.log('敬禮!我是' + this.name + '我今年' + this.age + '歲了');}// 實例化var hanmeimei = new Student('韓梅梅', 9, '女', '慕課小學', 100556);hanmeimei.study();hanmeimei.sayHello();hanmeimei.sleep();var laozhang = new People('老張', 66, '男');laozhang.sayHello();</script>
    </body></html>
    

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

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

相關文章

HDMI接口的PCB布局布線要求

高清多媒體接口&#xff08;High Definition Multimedia Interface&#xff09;&#xff0c;簡稱&#xff1a;HDMI&#xff0c;是一種全數字化視頻和聲音發送接口&#xff0c;可以發送未壓縮的音頻及視頻信號。隨著技術的不斷提升&#xff0c;HDMI的傳輸速率也不斷的提升&#…

使用GEWE框架進行微信群組管理(三)

友情鏈接&#xff1a;GEWE框架官網 geweapi.com 點擊訪問即可。 邀請或添加聯系人進群 小提示&#xff1a; 不管是添加40人以內還是以上都用此接口cause填寫邀請進群的理由 請求URL&#xff1a; http://域名地址/api/group/invite 請求方式&#xff1a; POST 請求頭&…

brew+nginx配置靜態文件服務器

背景 一下子閑下來了&#xff0c;了解的我的人都知道我閑不下來。于是&#xff0c;我在思考COS之后&#xff0c;決定自己整一個本地的OSS&#xff0c;實現靜態文件的訪問。那么&#xff0c;首屈一指的就是我很熟的nginx。也算是個小復習吧&#xff0c;復習一下nginx代理靜態文…

解決生成式AI落地之困,亞馬遜云科技提供完整解決方案

生成式AI技術無疑是當前最大的時代想象力之一。 資本、創業者、普通人都在涌入生成式AI里去一探究竟&#xff1a;“百模大戰”連夜打響&#xff0c;融資規模連創新高&#xff0c;各種消費類產品概念不斷涌現……根據Bloomberg Intelligence 的報告&#xff0c;2022年生成式AI 市…

文件操作/IO

文件 文件是一種在硬盤上存儲數據的方式&#xff0c;操作系統幫我們把硬盤的一些細節都封裝起來了&#xff0c;程序員只需要了解文件相關的接口即可&#xff0c;相當于操作文件就是間接的操作硬盤了 硬盤用來存儲數據&#xff0c;和內存相比硬盤的存儲空間更大&#xff0c;訪問…

使用FTP文件傳輸協議的潛在風險

數據&#xff08;事實&#xff0c;數字&#xff0c;價值&#xff09;是當今業務運行的核心要素。但是&#xff0c;如果數據沒有得到有效的存儲和傳輸&#xff0c;它們就會成為阻礙業務發展的障礙。如果企業不能及時地把數據送到合適的地方&#xff0c;就會造成嚴重的經濟損失。…

【skynet】skynet 入門代碼

寫在前面 本文將從零開始&#xff0c;寫第一個 skynet 程序 HelloWorld 。通過 HelloWorld 可以熟悉 skynet 的運作方式&#xff0c;和了解其 api 。 文章目錄 寫在前面準備工作編寫代碼運行結果 準備工作 首先要有一個編譯好&#xff0c;而且工作正常的 skynet 。 編寫代碼…

【Linux】Shell腳本之流程控制語句 if判斷、for循環、while循環、case循環判斷 + 實戰詳解[?建議收藏!!?]

&#x1f468;?&#x1f393;博主簡介 &#x1f3c5;云計算領域優質創作者 ??&#x1f3c5;華為云開發者社區專家博主 ??&#x1f3c5;阿里云開發者社區專家博主 &#x1f48a;交流社區&#xff1a;運維交流社區 歡迎大家的加入&#xff01; &#x1f40b; 希望大家多多支…

.bit域名調研

.bit域名研究 問題&#xff1a; .bit域名和ENS域名的相同點&#xff1f;不同點&#xff1f;有什么關系&#xff1f; .bit的定義 .bit 是基于區塊鏈的&#xff0c;開源的&#xff0c;跨鏈去中心化賬戶系統.bit 提供了以 .bit 為后綴的全局唯一的命名體系&#xff0c;可用于加密…

安全第二次

一&#xff0c;iframe <iframe>標簽用于在網頁里面嵌入其他網頁。 1&#xff0c;sandbox屬性 如果嵌入的網頁是其他網站的頁面&#xff0c;因不了解對方會執行什么操作&#xff0c;因此就存在安全風險。為了限制<iframe>的風險&#xff0c;HTML 提供了sandb…

分布式應用:Zabbix監控MariaDB

目錄 一、理論 1.Zabbix監控MariaDB 二、實驗 1.Zabbix監控MariaDB 一、理論 1.Zabbix監控MariaDB &#xff08;1&#xff09;環境 zabbix服務端&#xff1a;192.168.204.214 zabbix客戶端&#xff1a;192.168.204.215 &#xff08;2&#xff09;MareaDB安裝 安裝 za…

做海外游戲推廣有哪些條件?

做海外游戲推廣需要充分準備和一系列條件的支持。以下是一些關鍵條件&#xff1a; 市場調研和策略制定&#xff1a;了解目標市場的文化、玩家偏好、競爭格局等是必要的。根據調研結果制定適合的推廣策略。 本地化&#xff1a;將游戲內容、界面、語言、貨幣等進行本地化&#…

使用ip2region獲取客戶端地區

目錄 從gitee拉取ip2region.xdb資源文件 寫測試類 注意要寫對資源路徑 本地測試結果 ?編輯 遠端測試結果 從gitee拉取ip2region.xdb資源文件 git clone https://gitee.com/lionsoul/ip2region.git 將xdb放入resources資源文件夾 引入依賴 <dependency><groupId&…

由淺入深C系列五:使用libcurl進行基于http get/post模式的C語言交互應用開發

使用libcurl進行基于http get/post模式的C語言交互應用開發 簡介環境準備在線資源示例代碼測試調用運行結果 簡介 大多數在linux下的開發者&#xff0c;都會用到curl這個命令行工具。對于進行restful api的測試等&#xff0c;非常方便。其實&#xff0c;這個工具還提供了一個C…

Python中單引號、雙引號和三引號的區別

① 單引號和雙引號主要用來表示字符串 # 單引號 astr = Python print(type(astr)) # <class str># 雙引號"" bstr = "Python" print(type(bstr)) # <class str> str1 = I\m a big fan of Python. print(str1) # Im a big fan of Python.s…

[HDLBits] Exams/m2014 q4d

Implement the following circuit: module top_module (input clk,input in, output out);always(posedge clk) beginout<out^in;end endmodule直接寫out^in就行

Vue 使用 vite 創建項目

vite 是新一代前端構建工具&#xff0c;和 webpack 類似。 vite 的啟動速度更快。在開發環境中&#xff0c;不需要打包就可以直接運行。 vite 的更新速度更快。當修改內容后&#xff0c;不需要刷新瀏覽器&#xff0c;頁面就會實時更新。 vite 完全是按需編譯。它只會編譯需要…

【考研數學】高等數學第三模塊——積分學 | Part II 定積分(反常積分及定積分應用)

文章目錄 前言三、廣義積分3.1 斂散性概念&#xff08;一&#xff09;積分區間為無限的廣義積分&#xff08;二&#xff09;積分區間有限但存在無窮間斷點 3.2 斂散性判別法 四、定積分應用寫在最后 前言 承接前文&#xff0c;梳理完定積分的定義及性質后&#xff0c;我們進入…

企業網盤 vs 傳統存儲設備:為何云存儲成為首選?

企業網盤的出現為企業提供了新的存儲方式&#xff0c;相較于傳統的存儲設備&#xff0c;為何越來越多的企業選擇了云存儲呢&#xff1f; 一、存儲成本 在企業數據存儲方面&#xff0c;成本是企業重要的考量因素。企業網盤是基于云存儲技術的存儲工具&#xff0c;因此它比傳統的…

基于DBN的偽測量配電網狀態估計,DBN的詳細原理

目錄 背影 DBN神經網絡的原理 DBN神經網絡的定義 受限玻爾茲曼機(RBM) DBN的偽測量配電網狀態估計 基本結構 主要參數 數據 MATALB代碼 結果圖 展望 背影 DBN是一種深度學習神經網絡,擁有提取特征,非監督學習的能力,是一種非常好的分類算法,本文將DBN算法偽測量配電網…