搜尋
首頁web前端js教程JavaScript物件的建構子和new運算子(實例詳解)

本篇文章為大家帶來了關於javascript的相關知識,其中主要介紹了關於物件的建構子和new操作符,建構函式是所有物件的成員方法中,最早被調用的那個,下面一起來看看吧,希望對大家有幫助。

JavaScript物件的建構子和new運算子(實例詳解)

【相關推薦:javascript影片教學web前端

23.JavaScript物件的建構函式和運算子new

一、前言

前文講到的物件建立方法都是直接使用let obj = { ...}語法,具體方法如下:

let user = {
    name:'xiaoming',
    ...}

這樣的物件建立方法雖然簡單又直接,但是物件的程式碼無法重複使用,在建立許多類似物件時,程式碼量會很高。

此時,就需要使用建構函數,和new運算子實作相似物件的建構。

二、建構子

如果學過其他物件導向語言的童鞋對建構方法應該都不陌生,尤其是學習C 的童鞋應該印象會非常深刻。

建構函數概念和用途

在其他物件導向的語言中,建構函數通常是這樣定義的:

##建構函數是一個特殊的成員函數,名字與類別名稱相同,在創建類別類型物件時由編譯器自動調用,保證每個資料成員都有一個合適的初始值,並且在物件的生命週期內只調用一次。

我們可以簡單的理解為,建構子是所有物件的成員方法中,最早被呼叫的那個。常用於初始化物件的狀態,例如人的名字、火車的節數等。

和建構子對應的是

析構函式,析構函式是所有物件的成員方法中,最後被呼叫的那個,常常是物件失去存在價值,用來回收對象資源。

物件的生命週期

一個物件從建立到回收,總共可以分割為3個階段,如下圖:

JavaScript物件的建構子和new運算子(實例詳解)

其中,物件建立階段的主要工作由建構函式完成,包括物件的初始化,關係的連接等。執行階段主要是物件功能的調用,用於配合整個專案的執行,通常由普通函數(物件的成員函數)完成。銷毀階段由析構函數接手,用於清除物件佔用的記憶體空間,防止記憶體洩漏的發生。

JavaScript建構子

比起其他物件導向語言,

JavaScript物件的建構子比較特殊,它可以是任何一個普通的函數,而且無需在物件中定義。只有兩個約定:

    建構子的命名通常以大寫開頭;
  1. 建構子智慧由
  2. new運算子執行;
例如:

function People(name){
    this.name = name;}
以上程式碼中的

People函式就可以當作建構函式使用,同時它也是一個普通的函式。物件的this指標章節,我們介紹過,如果一個普通函數中使用thisthis的內容取決於呼叫它的物件(obj .func()),如果不使用物件呼叫函數,那麼this在非嚴格模式下就是Window,嚴格模式下就是undefined

通常情況下,直接呼叫建構函式會得到不正確的結果,如果我們希望把函式當作建構函式調用,就需要使用一個新的關鍵字

new

以下程式碼使用

new關鍵字建立了兩個People物件:

let xiaoming = new People('xiaoming');
let xiaohong = new People('xiaohong');
console.log(xiaoming.name);
console.log(xiaohong.name);
以下是程式碼的執行結果:

JavaScript物件的建構子和new運算子(實例詳解)

三、new 關鍵字

當使用

new呼叫一個函數時,這個函數就會變成建構函數,此時,引擎就會執行以下動作:

    建立一個新的空物件
  1. { },並把空物件賦值給this;
  2. #執行建構函數體,通常會透過
  3. this建構物件的內部結構;
  4. 傳回
  5. this的值;
你沒有看錯,使用

new呼叫函數後,函數是有傳回值的,即使定義函數時沒有return語句。

程式碼

new People('xiaoming')所做的事情大概類似以下程式碼:

function People(name){
    this = {};//隐式的创建一个空对象
    this.name = name;
    return this;//把创建的对象返回}
所以使用

new呼叫建構子後,得到的是一個由建構函數塑造過的物件。

使用new关键字的好处是,我们可以书写一次构造函数代码,然后在任意的地方创建类似的对象。

例如:

let xiaoming = new People('xiaoming');let xiaohong = new People('xiaohong');let mingming = new People('mingming');

想象一下,如果对象的代码有上百行,这么做是不是比{...}方式要简便很多呢?这就是面向对象中的代码服用,可以极大程度上降低代码量,提高开发速度。

如果构造函数没有参数,我们可以省略调用时的括号:

let xiaoming = new People;//类似于这样let xiaoming = new People();//等价于这样

但是个人推荐不要使用这种特性,仅仅是告知在规范中存在这种语法。

强调:

从技术上讲,任何函数(除了箭头函数,它没有自己的 this)都可以用作构造器。即可以通过 new 来运行,它会执行上面的算法。“首字母大写”是一个共同的约定,以明确表示一个函数将被使用 new 来运行。

四、匿名构造函数

如果我们只希望对象被创建一次,那么就可以简化构造函数的定义,使用new直接调用匿名函数,创建一个对象:

let xiaoming = new function(){
    this.name = 'xiaoming';}console.log(xiaoming.name);

代码的执行结果如下:

JavaScript物件的建構子和new運算子(實例詳解)

使用匿名函数当作构造函数的结果和常规构造函数没有任何区别,唯一的区别是匿名构造函数不能重复调用(因为没有名字)。这种使用方法常用在无需复用代码的场景中。

五、构造函数的返回值

常规情况下,构造函数不需要使用return语句,它的唯一用途就是把对象的属性写入this,然后直接默认返回this对象就好了。

但是,由于JavaScript对构造函数几乎没有任何约束,如果我们在一个普通函数中写了返回语句,会发生什么呢?引擎会做下面两个选择:

  1. 如果return返回的是一个对象,就返回这个对象,不再返回this
  2. 如果return返回的是一个基础类型,则忽略返回语句,继续返回this

从引擎的处理方式中不难看出,构造函数的主要任务就是创建对象,处理并返回,如果使用构造函数返回一个基础类型,是没有意义的。

举个栗子:

function People(name){
    this.name = name;
	return {name:'Nobody'};}console.log(new People('xiaoming').name);

代码执行结果如下:

JavaScript物件的建構子和new運算子(實例詳解)

可以看出,name为’xiaoming’的对象没有被返回,而是Nobody对象代替了xiaoming

如果使用return返回一个基础类型,案例如下:

function Dog(){
    this.name = 'hashiqi';
	return 666;}console.log(new Dog().name);

代码执行结果如下:

JavaScript物件的建構子和new運算子(實例詳解)

可见,在返回基础类型时,return语句是不生效的。

强调:

通常对象的构造函数没有返回值,我们也没有必要利用引擎对构造函数返回值的特殊处理,编写特别的构造函数。

六、利用构造函数为对象添加方法

在构造函数中不仅可以添加对象的属性,由于JavaScript的函数同样可以赋值给变量,我们还可以用构造函数初始化对象的成员方法。

例如,我们可以给People对象增加一个sing方法:

function People(name){
    this.name = name;
    this.sing = function(){
        console.log(`${name} is a happy boy.`);
    }}let xiaoming = new People('xiaoming');xiaoming.sing();

以上代码在构造函数中为对象添加了一个方法,代码执行结果如下:

JavaScript物件的建構子和new運算子(實例詳解)

结语

截止到目前,我们介绍的对象都只是以JavaScript的一个特殊数据类型(数据结构)角度出发的,实际上,在面向对象领域,类才是绝对的主角。

我们会在后文逐步深入介绍JavaScript的各种特性,包括面向对象知识,类、继承等。

总结

本文主要介绍了JavaScript对象的构造方法和new关键字,需要掌握并注意的点包括:

  1. 建構函數是一個常規函數,但是有一些首字母大寫的約定;
  2. 箭頭函數由於沒有this,因此不能作為建構子;
  3. 建構函數需要使用new關鍵字調用,並傳回一個物件;
  4. 當建構函式本身擁有返回語句時,引擎會做特殊處理;

#【相關推薦:javascript影片教學web前端

以上是JavaScript物件的建構子和new運算子(實例詳解)的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文轉載於:CSDN。如有侵權,請聯絡admin@php.cn刪除
超越瀏覽器:現實世界中的JavaScript超越瀏覽器:現實世界中的JavaScriptApr 12, 2025 am 12:06 AM

JavaScript在現實世界中的應用包括服務器端編程、移動應用開發和物聯網控制:1.通過Node.js實現服務器端編程,適用於高並發請求處理。 2.通過ReactNative進行移動應用開發,支持跨平台部署。 3.通過Johnny-Five庫用於物聯網設備控制,適用於硬件交互。

使用Next.js(後端集成)構建多租戶SaaS應用程序使用Next.js(後端集成)構建多租戶SaaS應用程序Apr 11, 2025 am 08:23 AM

我使用您的日常技術工具構建了功能性的多租戶SaaS應用程序(一個Edtech應用程序),您可以做同樣的事情。 首先,什麼是多租戶SaaS應用程序? 多租戶SaaS應用程序可讓您從唱歌中為多個客戶提供服務

如何使用Next.js(前端集成)構建多租戶SaaS應用程序如何使用Next.js(前端集成)構建多租戶SaaS應用程序Apr 11, 2025 am 08:22 AM

本文展示了與許可證確保的後端的前端集成,並使用Next.js構建功能性Edtech SaaS應用程序。 前端獲取用戶權限以控制UI的可見性並確保API要求遵守角色庫

JavaScript:探索網絡語言的多功能性JavaScript:探索網絡語言的多功能性Apr 11, 2025 am 12:01 AM

JavaScript是現代Web開發的核心語言,因其多樣性和靈活性而廣泛應用。 1)前端開發:通過DOM操作和現代框架(如React、Vue.js、Angular)構建動態網頁和單頁面應用。 2)服務器端開發:Node.js利用非阻塞I/O模型處理高並發和實時應用。 3)移動和桌面應用開發:通過ReactNative和Electron實現跨平台開發,提高開發效率。

JavaScript的演變:當前的趨勢和未來前景JavaScript的演變:當前的趨勢和未來前景Apr 10, 2025 am 09:33 AM

JavaScript的最新趨勢包括TypeScript的崛起、現代框架和庫的流行以及WebAssembly的應用。未來前景涵蓋更強大的類型系統、服務器端JavaScript的發展、人工智能和機器學習的擴展以及物聯網和邊緣計算的潛力。

神秘的JavaScript:它的作用以及為什麼重要神秘的JavaScript:它的作用以及為什麼重要Apr 09, 2025 am 12:07 AM

JavaScript是現代Web開發的基石,它的主要功能包括事件驅動編程、動態內容生成和異步編程。 1)事件驅動編程允許網頁根據用戶操作動態變化。 2)動態內容生成使得頁面內容可以根據條件調整。 3)異步編程確保用戶界面不被阻塞。 JavaScript廣泛應用於網頁交互、單頁面應用和服務器端開發,極大地提升了用戶體驗和跨平台開發的靈活性。

Python還是JavaScript更好?Python還是JavaScript更好?Apr 06, 2025 am 12:14 AM

Python更适合数据科学和机器学习,JavaScript更适合前端和全栈开发。1.Python以简洁语法和丰富库生态著称,适用于数据分析和Web开发。2.JavaScript是前端开发核心,Node.js支持服务器端编程,适用于全栈开发。

如何安裝JavaScript?如何安裝JavaScript?Apr 05, 2025 am 12:16 AM

JavaScript不需要安裝,因為它已內置於現代瀏覽器中。你只需文本編輯器和瀏覽器即可開始使用。 1)在瀏覽器環境中,通過標籤嵌入HTML文件中運行。 2)在Node.js環境中,下載並安裝Node.js後,通過命令行運行JavaScript文件。

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
3 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
3 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
3 週前By尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解鎖Myrise中的所有內容
4 週前By尊渡假赌尊渡假赌尊渡假赌

熱工具

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SecLists

SecLists

SecLists是最終安全測試人員的伙伴。它是一個包含各種類型清單的集合,這些清單在安全評估過程中經常使用,而且都在一個地方。 SecLists透過方便地提供安全測試人員可能需要的所有列表,幫助提高安全測試的效率和生產力。清單類型包括使用者名稱、密碼、URL、模糊測試有效載荷、敏感資料模式、Web shell等等。測試人員只需將此儲存庫拉到新的測試機上,他就可以存取所需的每種類型的清單。

PhpStorm Mac 版本

PhpStorm Mac 版本

最新(2018.2.1 )專業的PHP整合開發工具

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

強大的PHP整合開發環境

SublimeText3 Linux新版

SublimeText3 Linux新版

SublimeText3 Linux最新版