Javascript 編程基礎(5)面向對象 | 5.1、構造函數實例化對象

文章目錄

  • 一、構造函數實例化對象
    • 1、基本語法
    • 2、構造函數與原型的關系
    • 3、完整的原型鏈
    • 4、構造函數的特點
    • 5、`prototype`與`__proto__`屬性
      • 5.1、對象實例的`__proto__`屬性
      • 5.2、`prototype`屬性僅存在于函數對象
      • 5.3、實例與原型的關系
      • 5.4、獲取對象原型
    • 6、注意事項

前言:

在 JavaScript 里,構造函數是創建對象實例的一種方式。構造函數本質上是普通的函數,不過有其特定的使用模式:要用 new 關鍵字來調用,這樣才能創建對象實例。下面為詳細介紹構造函數實例化對象的相關內容。

一、構造函數實例化對象

1、基本語法

使用構造函數創建對象實例,需要遵循以下步驟:

  • 定義一個構造函數,函數名一般首字母大寫(這是約定俗成的寫法,并非強制要求)。
  • 在構造函數內部,通過 this 關鍵字來設置對象的屬性和方法。
  • 使用 new 關鍵字調用構造函數,從而創建對象實例。

下面是一個簡單的例子:

// 定義一個構造函數
function Person(name, age) {this.name = name;this.age = age;this.sayHello = function() {console.log(`你好,我是${this.name},今年${this.age}歲了。`);};
}// 使用new關鍵字創建對象實例
const person1 = new Person('張三', 25);
const person2 = new Person('李四', 30);// 調用對象的屬性和方法
console.log(person1.name); // 輸出: 張三
person2.sayHello(); // 輸出: 你好,我是李四,今年30歲了。

2、構造函數與原型的關系

當使用 new 關鍵字調用構造函數時,會按照以下步驟執行:

  • 首先創建一個新對象。
  • 讓這個新對象的 [[Prototype]](即原型)指向構造函數的 prototype 屬性。
  • 將構造函數的 this 綁定到新創建的對象上。
  • 執行構造函數內部的代碼,這樣就可以為新對象設置屬性和方法。
  • 如果構造函數返回了一個對象,那么就返回該對象;否則,返回新創建的對象。

3、完整的原型鏈

一個典型的原型鏈如下所示:

實例對象 -> 構造函數.prototype -> Object.prototype -> null

驗證方法:

persona1.__proto__ === Person.prototype; // true
Person.prototype.__proto__ === Object.prototype; // true
Object.prototype.__proto__ === null; // true

4、構造函數的特點

  • 屬性和方法的復制:每次通過構造函數創建對象實例時,都會為每個實例復制一份屬性和方法。就像上面例子中的 sayHello 方法,每個實例都有自己獨立的副本。
  • 原型鏈繼承:所有通過同一個構造函數創建的對象實例,都會繼承構造函數 prototype 屬性上的方法和屬性。

下面通過代碼說明原型鏈繼承:

function Car(make, model) {this.make = make;this.model = model;
}// 給構造函數的prototype添加方法
Car.prototype.getInfo = function() {return `這是一輛${this.make} ${this.model}`;
};// 創建對象實例
const car1 = new Car('豐田', '卡羅拉');
const car2 = new Car('本田', '思域');// 調用原型上的方法
console.log(car1.getInfo()); // 輸出: 這是一輛豐田 卡羅拉。
console.log(car2.getInfo()); // 輸出: 這是一輛本田 思域。

5、prototype__proto__屬性

5.1、對象實例的__proto__屬性

在 JavaScript 中,對象實例本身沒有prototype屬性,但有__proto__屬性(非標準,對應內部的[[Prototype]])。以下是詳細說明:

  • __proto__(非標準):指向該對象的原型對象。
  • [[Prototype]](標準):內部屬性,實際決定原型鏈。
const obj = {};
console.log(obj.prototype); // undefined(實例沒有prototype屬性)
console.log(obj.__proto__ === Object.prototype); // true

5.2、prototype屬性僅存在于函數對象

每個函數默認有一個prototype屬性,指向其原型對象:

function Person() {}
console.log(Person.prototype); // { constructor: ? Person() }// 驗證函數也是對象,其原型是Function.prototype
console.log(Person.__proto__ === Function.prototype); // true

5.3、實例與原型的關系

當使用new創建對象時,實例的__proto__指向構造函數的prototype

function Person() {}
const alice = new Person();console.log(alice.__proto__ === Person.prototype); // true
console.log(Person.prototype.constructor === Person); // true

5.4、獲取對象原型

推薦使用標準方法Object.getPrototypeOf()獲取對象原型:

const obj = {};
console.log(Object.getPrototypeOf(obj) === Object.prototype); // true

6、注意事項

  • 忘記使用 new 關鍵字的問題:如果在調用構造函數時忘記使用 new 關鍵字,this 會指向全局對象(在瀏覽器環境中是 window 對象),這可能會導致意外的結果。為了避免這種情況,可以使用箭頭函數或者在構造函數內部檢查 this 是否是當前構造函數的實例。
  • 性能方面的考慮:如果構造函數內部定義了大量方法,每個對象實例都會擁有這些方法的獨立副本,這會造成內存的浪費。通常的做法是將共享的方法定義在構造函數的 prototype 上。

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

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

相關文章

自動駕駛科普(百度Apollo)學習筆記

1. 寫在前面 在過去的幾年里,自動駕駛技術取得飛速發展,人類社會正逐漸走向一個新時代,這個時代中,汽車不僅僅是一個交通工具,更是一個智能的、能夠感知環境、做出決策并自主導航的機器伙伴。現在正好也從事這塊的工作…

Windows應用-音視頻捕獲

下載“Windows應用-音視頻捕獲”項目 本應用可以同時捕獲4個視頻源和4個音頻源,可以監視視頻源圖像,監聽音頻源;可以將視頻源圖像寫入MP4文件,將音頻源寫入MP3或WAV文件;還可以錄制系統播放的聲音。本應用使用MFC對話框…

MATLAB生成大規模無線通信網絡拓撲(任意節點數量)

功能: 生成任意節點數量的網絡拓撲,符合現實世界節點空間分布和連接規律 效果: 30節點: 100節點: 500節點: 程序: %創建時間:2025年6月8日 %zhouzhichao %自然生長出n節點的網絡% …

TDengine 開發指南—— UDF函數

UDF 簡介 在某些應用場景中,應用邏輯需要的查詢功能無法直接使用內置函數來實現,TDengine 允許編寫用戶自定義函數(UDF),以便解決特殊應用場景中的使用需求。UDF 在集群中注冊成功后,可以像系統內置函數一…

C#提取CAN ASC文件時間戳:實現與性能優化

C#提取CAN ASC文件時間戳:實現與性能優化 在汽車電子和工業控制領域,CAN總線是最常用的通信協議之一。而ASC(ASCII)文件作為CAN總線數據的標準日志格式,廣泛應用于數據記錄和分析場景。本文將深入探討如何高效地從CAN…

計算機網絡基礎總結:TCP/IP 模型、TCP vs UDP、DNS 查詢過程

在學習計算機網絡的過程中,理解 TCP/IP 模型與 OSI 模型的對應關系、掌握 TCP 與 UDP 的區別,以及熟悉 DNS 的查詢過程,是打好網絡基礎的關鍵。本文將圍繞這三部分進行簡明扼要的講解。 一、TCP/IP 模型與 OSI 七層模型的對應關系 1. OSI 七…

基于PHP的扎染文創產品商城

有需要請加文章底部Q哦 可遠程調試 基于PHP的扎染文創產品商城 一 介紹 扎染文創產品商城系統基于原生PHP開發,數據庫mysql,前端bootstrap,jquery.js等。系統角色分為用戶和管理員。 技術棧:phpmysqlbootstrapphpstudyvscode 二…

數據庫學習(三)——MySQL鎖

一、MySQL鎖 當多個用戶或進程并發操作數據庫時,為了避免數據沖突、臟讀、不可重復讀、幻讀等問題,數據庫通過鎖機制來保證數據的一致性和完整性。 MySQL 鎖的總體分類: 分類維度類型說明按作用對象表級鎖(Table Lock&#xff…

<3>-MySQL表的操作

目錄 一,創建表 二,查看表結構 三,修改表 四,刪除表 一,創建表 語法: CREATE TABLE table_name ( field1 datatype, field2 datatype, field3 datatype ) character set 字符集 collate 校驗規則 eng…

【OSG學習筆記】Day 15: 路徑動畫與相機漫游

本章來學習下漫游相機。 路徑動畫與相機漫游 本屆內容比較簡單,其實就是實現物體的運動和相機的運動 當然這兩個要一起執行。 貝塞爾曲線 貝塞爾曲線(Bzier curve)是一種在計算機圖形學、動畫制作、工業設計等領域廣泛應用的參數曲線&am…

LabVIEW自感現象遠程實驗平臺

LabVIEW開發自感現象遠程實驗平臺,通過整合 NI數據采集設備、菲尼克斯(Phoenix Contact)繼電器模塊及羅技(Logitech)高清攝像頭,實現遠程數據采集、儀器控制與實時監控三大核心功能。平臺突破傳統實驗裝置局…

數據結構——F/圖

一、圖的基本概念 圖是由頂點集合及頂點間的關系組成的一種數據結構&#xff1a;G (V&#xff0c; E)&#xff0c;其中&#xff1a; 頂點集合V {x|x屬于某個數據對象集}是有窮非空集合&#xff1b; E {(x,y)|x,y屬于V}或者E {<x, y>|x,y屬于V && Path(x, y)…

springcloud openfeign 偶現 Caused by: java.net.UnknownHostException

背景 最近查看日志發現某服務偶現Caused by: java.net.UnknownHostException 同時查看eureka的access.log 出現如下異常 10.xxx.xxx.xxx - - [27/May/2025:23:57:29 0800] “PUT /eureka/apps/{appName}/{host}:xxx-job:8082?statusUP&lastDirtyTimestamp1748351637173 H…

第12篇:數據庫中間件日志設計與追蹤系統落地實踐

12.1 引言&#xff1a;中間件日志系統為何如此關鍵&#xff1f; 數據庫中間件作為連接前端應用與后端數據庫的“網關”&#xff0c;承載著路由、負載均衡、SQL 改寫、權限控制等復雜邏輯。 在出現 性能問題、故障排查、安全審計 等場景中&#xff0c;若沒有完善的日志體系&am…

OpenAI對抗法庭命令:捍衛ChatGPT用戶隱私之戰

人工智能公司OpenAI近期正積極對抗一項涉及隱私問題的法庭命令。該命令要求OpenAI保留所有ChatGPT用戶日志&#xff0c;包括已刪除的對話記錄以及通過API調用生成的聊天內容。 命令背后的真實動機 值得注意的是&#xff0c;法院發布這一指令并非出于對用戶隱私或內容安全的考…

嵌入式學習--江協stm32day5

USART 1. 引腳與接口層 異步引腳&#xff1a; TX&#xff1a;發送數據輸出&#xff1b;RX&#xff1a;接收數據輸入&#xff1b;SW_RX&#xff1a;單線半雙工模式的接收引腳&#xff08;替代 RX&#xff09;。 同步引腳&#xff1a;SCLK&#xff1a;同步模式下的時鐘輸出&…

使用Fiddler抓包

有時候需要跟蹤一些小程序的HTTP請求&#xff0c;但是無法像瀏覽器一樣F12查看請求&#xff0c;因此需要借助其他的工具進行&#xff0c;在這里推薦使用Fiddler 配置 此時檢查系統代理已經變成如下配置&#xff1a; 抓包 此時隨便打開一個小程序&#xff0c;就可以進行抓包…

python學習打卡day47

DAY 47 注意力熱圖可視化 昨天代碼中注意力熱圖的部分順移至今天 知識點回顧&#xff1a; 熱力圖 作業&#xff1a;對比不同卷積層熱圖可視化的結果 # 可視化空間注意力熱力圖&#xff08;顯示模型關注的圖像區域&#xff09; def visualize_attention_map(model, test_loader,…

MySQL-運維篇

運維篇 日志 錯誤日志 錯誤日志是 MySQL 中最重要的日志之一&#xff0c;它記錄了當 mysqld 啟動和停止時&#xff0c;以及服務器在運行過程中發生任何嚴重錯誤時的相關信息當數據庫出現任何故障導致無法正常使用時&#xff0c;建議首先查看此日志。 該日志是默認開啟的&am…

Prompt Tuning(提示調優)到底訓練優化的什么部位

Prompt Tuning(提示調優)到底訓練優化的什么部位 在自然語言處理(NLP)領域,Prompt Tuning(提示調優)是一種輕量級的模型優化技術,其核心目標是通過優化提示(Prompt)來引導預訓練語言模型(如GPT、BERT等)更好地完成特定任務,而無需大規模調整模型的主體參數。 一…