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

