JavaScript中實(shí)例化與非實(shí)例化的區(qū)別與應(yīng)用場(chǎng)景詳解
引言
在學(xué)習(xí) JavaScript 的過(guò)程中,很多同學(xué)都會(huì)遇到這樣的問(wèn)題:為什么有的函數(shù)直接調(diào)用就能用,而有的必須要通過(guò) new 來(lái)實(shí)例化?
這背后其實(shí)就是 實(shí)例化 和 不實(shí)例化 的區(qū)別。本文就帶你從概念、代碼示例、應(yīng)用場(chǎng)景幾個(gè)方面,深入理解它們的不同。
一、什么是實(shí)例化?
實(shí)例化(Instantiation)指的是通過(guò) 構(gòu)造函數(shù)(Constructor) 或 類(lèi)(Class) 創(chuàng)建一個(gè)具體的對(duì)象實(shí)例(Instance)。
在 JavaScript 中,通常使用 new 關(guān)鍵字來(lái)完成實(shí)例化。例如:
function Person(name, age) {
this.name = name;
this.age = age;
}
const p1 = new Person("張三", 20); // 實(shí)例化
console.log(p1.name); // 張三
這里:
Person是一個(gè)構(gòu)造函數(shù);new Person("張三", 20)就是對(duì)Person的實(shí)例化,返回了一個(gè)具體的對(duì)象。
二、不實(shí)例化是什么?
所謂不實(shí)例化,就是直接調(diào)用函數(shù),而不使用 new。此時(shí)函數(shù)只是作為普通函數(shù)執(zhí)行,不會(huì)創(chuàng)建對(duì)象實(shí)例。
function Person(name, age) {
this.name = name;
this.age = age;
}
Person("李四", 22); // 不實(shí)例化
console.log(window.name); // 瀏覽器環(huán)境下 -> 李四
在上面的代碼中:
- 沒(méi)有
new,所以this指向全局對(duì)象(瀏覽器中是window,Node.js 中是global)。 - 導(dǎo)致屬性
name、age被掛載到了全局對(duì)象上,而不是新建的對(duì)象實(shí)例中。
三、實(shí)例化和不實(shí)例化的區(qū)別
我們可以從幾個(gè)角度來(lái)看它們的不同:
| 對(duì)比點(diǎn) | 實(shí)例化(new 調(diào)用) | 不實(shí)例化(直接調(diào)用) |
|---|---|---|
| 返回值 | 返回一個(gè)對(duì)象實(shí)例 | 返回函數(shù)本身的返回值(若無(wú)返回值則是 undefined) |
| this 指向 | 指向新創(chuàng)建的對(duì)象 | 指向調(diào)用環(huán)境(嚴(yán)格模式下是 undefined,非嚴(yán)格模式下是 window) |
| 用途 | 創(chuàng)建對(duì)象,封裝屬性和方法 | 普通函數(shù)調(diào)用,執(zhí)行邏輯或計(jì)算 |
| 內(nèi)存結(jié)構(gòu) | 會(huì)在堆內(nèi)存中創(chuàng)建一個(gè)獨(dú)立的對(duì)象實(shí)例 | 沒(méi)有獨(dú)立對(duì)象實(shí)例,只是執(zhí)行代碼 |
| 適用場(chǎng)景 | 類(lèi)、構(gòu)造函數(shù)、面向?qū)ο箝_(kāi)發(fā) | 工具函數(shù)、業(yè)務(wù)邏輯函數(shù) |
四、舉個(gè)例子:類(lèi)和工具函數(shù)
1. 構(gòu)造函數(shù)/類(lèi)(需要實(shí)例化)
class Animal {
constructor(type) {
this.type = type;
}
speak() {
console.log(`${this.type} 在叫`);
}
}
const dog = new Animal("狗"); // 實(shí)例化
dog.speak(); // 狗 在叫
這里必須使用 new,否則會(huì)報(bào)錯(cuò):Class constructor Animal cannot be invoked without 'new'。
2. 工具函數(shù)(不需要實(shí)例化)
function add(a, b) {
return a + b;
}
console.log(add(1, 2)); // 3
像這種純粹計(jì)算的函數(shù),只需直接調(diào)用即可,不需要也不能實(shí)例化。
五、總結(jié)
- 實(shí)例化:用
new調(diào)用構(gòu)造函數(shù)/類(lèi),返回對(duì)象實(shí)例,適合創(chuàng)建可復(fù)用的對(duì)象結(jié)構(gòu)。 - 不實(shí)例化:直接調(diào)用函數(shù),執(zhí)行邏輯或返回結(jié)果,適合寫(xiě)工具函數(shù)或業(yè)務(wù)邏輯函數(shù)。
簡(jiǎn)單一句話(huà)概括:
要?jiǎng)?chuàng)建對(duì)象時(shí)用實(shí)例化;只是執(zhí)行邏輯時(shí)不用實(shí)例化。
寫(xiě)在最后
在實(shí)際開(kāi)發(fā)中,你可以根據(jù)需求來(lái)選擇:
- 如果是 構(gòu)造對(duì)象/封裝屬性方法 —— 用
new實(shí)例化; - 如果是 簡(jiǎn)單邏輯處理/工具函數(shù) —— 直接調(diào)用,不需要實(shí)例化。
到此這篇關(guān)于JavaScript中實(shí)例化與非實(shí)例化的區(qū)別與應(yīng)用場(chǎng)景詳解的文章就介紹到這了,更多相關(guān)JavaScript實(shí)例化與非實(shí)例化內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
JS函數(shù)進(jìn)階之prototy用法實(shí)例分析
這篇文章主要介紹了JS函數(shù)進(jìn)階之prototy用法,結(jié)合實(shí)例形式分析了JavaScript函數(shù)中使用prototy擴(kuò)展屬性相關(guān)操作技巧,需要的朋友可以參考下2020-01-01
5秒后跳轉(zhuǎn)到另一個(gè)頁(yè)面的js代碼
跳轉(zhuǎn)到另一個(gè)頁(yè)面的方法有很多,在本文將為大家詳細(xì)介紹下js中如何實(shí)現(xiàn)5秒后跳轉(zhuǎn)到另一個(gè)頁(yè)面,感興趣的朋友可不要錯(cuò)過(guò)2013-10-10
JavaScript常見(jiàn)數(shù)組方法之如何轉(zhuǎn)置矩陣
這篇文章主要給大家介紹了關(guān)于JavaScript常見(jiàn)數(shù)組方法之如何轉(zhuǎn)置矩陣的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2022-03-03
BootStrap 智能表單實(shí)戰(zhàn)系列(二)BootStrap支持的類(lèi)型簡(jiǎn)介
這篇文章主要介紹了BootStrap 智能表單實(shí)戰(zhàn)系列(二)BootStrap支持的類(lèi)型簡(jiǎn)介 的相關(guān)資料,非常不錯(cuò)具有參考借鑒價(jià)值,感興趣的朋友一起學(xué)習(xí)吧2016-06-06
深入解析ECMAScript?2023?中的新數(shù)組方法
ECMAScript?是一種標(biāo)準(zhǔn)化的腳本語(yǔ)言,它是?JavaScript?的規(guī)范。ECMAScript?2023?是?JavaScript?編程語(yǔ)言的更新,旨在帶來(lái)改進(jìn)并使?JavaScript?程序可預(yù)測(cè)和可維護(hù),這篇文章主要介紹了探索?ECMAScript?2023?中的新數(shù)組方法,需要的朋友可以參考下2023-12-12
two.js之實(shí)現(xiàn)動(dòng)畫(huà)效果示例
本篇文章主要介紹了two.js之實(shí)現(xiàn)動(dòng)畫(huà)效果示例,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-11-11
JavaScript操作localStorage實(shí)現(xiàn)保存本地json文件
這篇文章主要為大家詳細(xì)介紹了JavaScript如何操作localStorage實(shí)現(xiàn)保存本地json文件,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-02-02
JavaScript SHA512&SHA256加密算法詳解
本文給大家分享的是javascript版的SHA512&SHA256加密算法的代碼,以及用法,有需要的小伙伴可以參考下。2015-08-08
如何讓div span等元素能響應(yīng)鍵盤(pán)事件操作指南
在我這幾天的工作中遇到了一個(gè)問(wèn)題,我有一個(gè)可編輯的div,并且在DIV里面還有一個(gè)可編輯的span,我想要讓span能響應(yīng)鍵盤(pán)事,想實(shí)現(xiàn)這種效果,應(yīng)該如何實(shí)踐呢2012-11-11
解決JSON.stringify()自動(dòng)將中文轉(zhuǎn)譯成unicode的問(wèn)題
下面小編就為大家分享一篇解決JSON.stringify()自動(dòng)將中文轉(zhuǎn)譯成unicode的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-01-01

