個人簡介
??個人主頁: 前端雜貨鋪
???♂?學(xué)習(xí)方向: 主攻前端方向,正逐漸往全干發(fā)展
??個人狀態(tài): 研發(fā)工程師,現(xiàn)效力于中國工業(yè)軟件事業(yè)
??人生格言: 積跬步至千里,積小流成江海
??推薦學(xué)習(xí):??前端面試寶典 ??Vue2 ??Vue3 ??Vue2/3項(xiàng)目實(shí)戰(zhàn) ??Node.js??Three.js ??JS版算法
??個人推廣:每篇文章最下方都有加入方式,旨在交流學(xué)習(xí)&資源分享,快加入進(jìn)來吧
??前言
大家好,這里是前端雜貨鋪。
前幾天在公司做項(xiàng)目的時候發(fā)現(xiàn)了一個問題 => 在帶 static 關(guān)鍵字的方法里面調(diào)用該類中的其他方法,其他方法也需要帶 static 關(guān)鍵字。
舉個簡單的栗子:
class Person {
static toDo() {
this.say();
}
say() {
console.log('to say');
}
}
Person.toDo();
我相信,會有一部分小伙伴認(rèn)為輸出的結(jié)果是 to say
(和你一樣,我一開始也這么認(rèn)為),但實(shí)際的輸出結(jié)果是:
是的,它報錯了,它說 say 不是一個方法,這不胡扯嗎?say 怎么可能不是一個方法?!
先別急,我們給 say 方法前面加上 static 關(guān)鍵字讓其成為一個靜態(tài)方法,再看看還會不會報錯?
class Person {
static toDo() {
this.say();
}
static say() {
console.log('to say');
}
}
Person.toDo();
很神奇,加上 static 它就不報錯了…
??static施了什么魔法
在了解 static 施了什么魔法之前我們先認(rèn)識一下 static 吧。
在 MDN 上是這樣定義static 的:
關(guān)鍵字 static 將為一個類定義一個靜態(tài)方法。靜態(tài)方法不是在一個實(shí)例之上被調(diào)用,而是在類自身之上被調(diào)用。它們通常是工具函數(shù),比如用來創(chuàng)建或者復(fù)制對象。
(注:“工具函數(shù)” 就是指具有某些功能的函數(shù),這些函數(shù)(或者叫做方法)就像工具一樣,當(dāng)我們需要它們的時候,就可以使用它們)
我們簡單認(rèn)識了 static 的定義和用途,那么接下來我們來分析一下為什么在方法前加上 static 關(guān)鍵字就不報錯呢?
生命周期不同:
靜態(tài)方法屬于類。 靜態(tài)方法的生命周期跟相應(yīng)的類一樣長,靜態(tài)方法和靜態(tài)變量會隨著類的定義而被分配和裝載入內(nèi)存中。一直到線程結(jié)束,靜態(tài)屬性和方法才被銷毀。
非靜態(tài)方法屬于對象。 非靜態(tài)方法的生命周期和類的實(shí)例化對象一樣長,只有當(dāng)類實(shí)例化了一個對象,非靜態(tài)方法才會被創(chuàng)建,而當(dāng)這個對象被銷毀時,非靜態(tài)方法也馬上被銷毀。
所以,當(dāng)對象不存在時非靜態(tài)方法也不存在,靜態(tài)方法自然也就不能調(diào)用一個不存在(非靜態(tài))的方法。
??知識擴(kuò)展
現(xiàn)在我們知道了 靜態(tài)方法不能調(diào)用非靜態(tài)方法,那么非靜態(tài)方法可以調(diào)用靜態(tài)方法嗎?經(jīng)過我們上述的分析,答案是肯定的!
class Person {
toDo() {
Person.say();
}
static say() {
console.log('to say');
}
}
let person = new Person();
person.toDo();
尺有所短寸有所長,static 當(dāng)然也不是完美的…
static的優(yōu)點(diǎn):
- 屬于類級別的,不需要創(chuàng)建對象就可以直接使用
- 全局唯一,內(nèi)存唯一,靜態(tài)變量可以唯一標(biāo)識某些狀態(tài)
- 在類加載時候初始化,常駐在內(nèi)存中,調(diào)用快捷方便
static的缺點(diǎn):
- 靜態(tài)方法不能調(diào)用非靜態(tài)的方法和變量.(非靜態(tài)方法可以任意的調(diào)用靜態(tài)方法/變量)
- 不能使用this和super關(guān)鍵字(屬于類級別,沒有創(chuàng)建對象前不可用this/super)
應(yīng)用場景:
- 靜態(tài)方法最適合工具類中方法的定義;比如文件操作,日期處理方法等.
- 靜態(tài)方法適合入口方法的定義;如單例模式,因?yàn)閺耐獠磕貌坏綐?gòu)造函數(shù),所以定義一個靜態(tài)的方法獲取對象非常有必要.
- 靜態(tài)變量適合全局變量的定義.(如布爾型靜態(tài)成員變量做控制符)
靜態(tài)方法效率上比實(shí)例化高,因?yàn)殪o態(tài)方法不需要實(shí)例化的過程。
當(dāng)方法被頻繁調(diào)用時可以考慮使用靜態(tài)的,可以提高項(xiàng)目性能。如果很少使用盡量不要使用靜態(tài)方法,以免增加服務(wù)器的負(fù)擔(dān)。
????本篇小結(jié)
本篇文章我們探討了靜態(tài)方法。
靜態(tài)方法屬于類級別的,而非靜態(tài)方法屬于對象級別的。通過對 生命周期 的分析,我們理解了靜態(tài)方法中不能調(diào)用非靜態(tài)方法,而非靜態(tài)方法中可以調(diào)用靜態(tài)方法的原因。
之后我們對 static 的優(yōu)缺點(diǎn)進(jìn)行了列舉,對其應(yīng)用場景有了一定的認(rèn)識。
好啦,本篇文章到這里就要和大家說再見啦,祝你這篇文章閱讀愉快,你下篇文章的閱讀愉快留著我下篇文章再祝!
參考資料:文章來源:http://www.zghlxwxcb.cn/news/detail-674526.html
- MDN 官方文檔
- JavaScript 靜態(tài)方法 【作者:三季人 G】
- 百度百科 · 屈原《卜居》
文章來源地址http://www.zghlxwxcb.cn/news/detail-674526.html
到了這里,關(guān)于JavaScript——為什么靜態(tài)方法不能調(diào)用非靜態(tài)方法的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!