国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

JavaScript——為什么靜態(tài)方法不能調(diào)用非靜態(tài)方法

這篇具有很好參考價值的文章主要介紹了JavaScript——為什么靜態(tài)方法不能調(diào)用非靜態(tài)方法。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報違法"按鈕提交疑問。

個人簡介

??個人主頁: 前端雜貨鋪
???♂?學(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é)果是:

JavaScript——為什么靜態(tài)方法不能調(diào)用非靜態(tài)方法,100個疑難雜癥,javascript,前端

是的,它報錯了,它說 say 不是一個方法,這不胡扯嗎?say 怎么可能不是一個方法?!


先別急,我們給 say 方法前面加上 static 關(guān)鍵字讓其成為一個靜態(tài)方法,再看看還會不會報錯?

class Person {
    static toDo() {
        this.say();
    }
    static say() {
        console.log('to say');
    }
}

Person.toDo();

JavaScript——為什么靜態(tài)方法不能調(diào)用非靜態(tài)方法,100個疑難雜癥,javascript,前端

很神奇,加上 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();

JavaScript——為什么靜態(tài)方法不能調(diào)用非靜態(tài)方法,100個疑難雜癥,javascript,前端


尺有所短寸有所長,static 當(dāng)然也不是完美的…

static的優(yōu)點(diǎn):

  1. 屬于類級別的,不需要創(chuàng)建對象就可以直接使用
  2. 全局唯一,內(nèi)存唯一,靜態(tài)變量可以唯一標(biāo)識某些狀態(tài)
  3. 在類加載時候初始化,常駐在內(nèi)存中,調(diào)用快捷方便

static的缺點(diǎn):

  1. 靜態(tài)方法不能調(diào)用非靜態(tài)的方法和變量.(非靜態(tài)方法可以任意的調(diào)用靜態(tài)方法/變量)
  2. 不能使用this和super關(guān)鍵字(屬于類級別,沒有創(chuàng)建對象前不可用this/super)

應(yīng)用場景:

  1. 靜態(tài)方法最適合工具類中方法的定義;比如文件操作,日期處理方法等.
  2. 靜態(tài)方法適合入口方法的定義;如單例模式,因?yàn)閺耐獠磕貌坏綐?gòu)造函數(shù),所以定義一個靜態(tài)的方法獲取對象非常有必要.
  3. 靜態(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)識。

好啦,本篇文章到這里就要和大家說再見啦,祝你這篇文章閱讀愉快,你下篇文章的閱讀愉快留著我下篇文章再祝!


參考資料:

  1. MDN 官方文檔
  2. JavaScript 靜態(tài)方法 【作者:三季人 G】
  3. 百度百科 · 屈原《卜居》

JavaScript——為什么靜態(tài)方法不能調(diào)用非靜態(tài)方法,100個疑難雜癥,javascript,前端文章來源地址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)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 為什么MySQL單表不能超過2000萬行?

    摘要: MySQL一張表最多能存多少數(shù)據(jù)? 本文分享自華為云社區(qū)《為什么MySQL單表不能超過2000萬行?》,作者: GaussDB 數(shù)據(jù)庫 。 最近看到一篇《我說MySQL每張表最好不要超過2000萬數(shù)據(jù),面試官讓我回去等通知》的文章,非常有趣。 文中提到,他朋友在面試的過程中說,自己的

    2024年02月05日
    瀏覽(20)
  • 【PDF密碼】PDF文件不能打印,為什么?

    【PDF密碼】PDF文件不能打印,為什么?

    正常的PDF文件是可以打印的,如果PDF文件打開之后發(fā)現(xiàn)文件不能打印,我們需要先查看一下自己的打印機(jī)是否能夠正常運(yùn)行,如果打印機(jī)是正常的,我們再查看一下,文件中的打印功能按鈕是否是灰色的狀態(tài)。 如果PDF中的大多數(shù)功能按鈕以及打印按鈕都是灰色的狀態(tài),那就證

    2024年02月13日
    瀏覽(30)
  • springboot~InvocationHandler中為什么不能使用@Autowired

    @Autowired 是 Spring Framework 中用于自動注入依賴的注解,通常情況下可以正常工作,但有一些情況下可能無法獲取到 bean 對象: Bean未定義或未掃描到 :如果要注入的 bean 沒有在 Spring 上下文中定義或者沒有被正確掃描到, @Autowired 將無法找到要注入的 bean。確保你的 bean 配置正

    2024年02月10日
    瀏覽(22)
  • C++ vector元素類型為什么不能是引用

    vectorT 引用必須要進(jìn)行初始化,不能初始化為空對象,初始化后不能改變指向 引用是別名,不是對象,沒有實(shí)際地址, 不能定義引用的指針 ,也 不能定義引用的引用 推薦一個零聲學(xué)院項(xiàng)目課,個人覺得老師講得不錯,分享給大家: 零聲白金學(xué)習(xí)卡(含基礎(chǔ)架構(gòu)/高性能存儲

    2024年02月15日
    瀏覽(22)
  • mysql的主鍵索引為什么不能null

    這是一個非常奇怪且有趣的問題??梢酝ㄟ^官方文檔進(jìn)行解讀 https://dev.mysql.com/doc/refman/5.7/en/glossary.html A special value in SQL, indicating the absence of data. Any arithmetic operation or equality test involving a NULL value, in turn produces a NULL result. (Thus it is similar to the IEEE floating-point concept of NaN, “not

    2024年02月14日
    瀏覽(27)
  • inline內(nèi)聯(lián)函數(shù)為什么不能是虛函數(shù)?

    1. inline內(nèi)聯(lián)函數(shù)為什么不能是虛函數(shù)? 虛函數(shù)可以是內(nèi)聯(lián)函數(shù) ,內(nèi)聯(lián)是可以修飾虛函數(shù)的, 但是當(dāng)虛函數(shù)表現(xiàn)多態(tài)性的時候不能內(nèi)聯(lián) 。 理由如下:內(nèi)聯(lián)是在發(fā)生在編譯期間,編譯器會自主選擇內(nèi)聯(lián),而虛函數(shù)的多態(tài)性在運(yùn)行期,編譯器無法知道運(yùn)行期調(diào)用哪個代碼,因此

    2024年02月21日
    瀏覽(28)
  • 為什么 conda 不能升級 python 到 3.12

    弄清楚為什么執(zhí)行了如下升級命令后, python 版本還是 3.11? 因?yàn)?conda forge 沒有完成 migration Migration is the process on Conda Forge by which packages get rebuilt to support new global versions, such as Python 3.12 or R 4.3. Conda Forge provides a dashboard to track the status of migrations, such as Python 3.12. 遷移(migration)

    2024年02月05日
    瀏覽(18)
  • 為什么網(wǎng)絡(luò)可以ping通,還是不能ssh到目標(biāo)主機(jī)?

    ??做運(yùn)維工作,我們都是通過遠(yuǎn)程的方式去連接一臺服務(wù)器或者虛擬機(jī),很多初次做運(yùn)維的朋友可能經(jīng)常會遇到這樣一個問題:我ping目標(biāo)服務(wù)器的IP是通的,但是我通過ssh卻不能連上主機(jī)。今天,就來淺談一下,為什么你ping網(wǎng)絡(luò)是通的,但是卻不能連接到遠(yuǎn)程主機(jī),當(dāng)你弄

    2024年02月09日
    瀏覽(27)
  • 為什么分類問題不能使用mse損失函數(shù),更容易理解版本

    分類問題通常不適合使用均方誤差(Mean Squared Error,MSE)損失函數(shù),原因如下: 輸出差異的度量不同:MSE損失函數(shù)是基于預(yù)測值和真實(shí)值之間的差異的平方和進(jìn)行計算的,適用于回歸問題(建立一個模型來預(yù)測連續(xù)數(shù)值輸出的問題, eg: 房價預(yù)測;股票價格預(yù)測…),其中

    2024年04月26日
    瀏覽(19)
  • C靜態(tài)庫的創(chuàng)建與使用--為什么要引入靜態(tài)庫?

    C靜態(tài)庫的創(chuàng)建與使用--為什么要引入靜態(tài)庫?

    C源程序需要經(jīng)過預(yù)處理、編譯、匯編幾個階段,得到各自源文件對應(yīng)的 可重定位目標(biāo)文件 ,可重定位目標(biāo)文件就是各個源文件的二進(jìn)制機(jī)器代碼,一般是.o格式。比如:util1.c、util2.c及main.c三個C源文件,經(jīng)過預(yù)處理器、編譯器、匯編器的處理,就可以得到各自的目標(biāo)文件u

    2024年02月08日
    瀏覽(23)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包