JS中關(guān)于Class類的靜態(tài)屬性和靜態(tài)方法
一、類的兩個(gè)概念
1、類自身;
2、類的實(shí)例對(duì)象;
總的來(lái)說(shuō):靜態(tài)的是指向類自身,而不是指向?qū)嵗龑?duì)象,主要是歸屬不同,這是靜態(tài)屬性,靜態(tài)方法的核心。
二、對(duì)象的兩個(gè)部分
1、屬性
分為:實(shí)例屬性、靜態(tài)屬性(類屬性)、只讀屬性
2、方法
分為:實(shí)例方法、靜態(tài)方法(類方法)
class Person { ? //1、定義方法 ? /* 1.1、實(shí)例屬性,直接定義的屬性,要new實(shí)例后,實(shí)例去訪問(wèn)的*/ ? name= "tom"; ? age = 10; ? /* 1.2、靜態(tài)屬性(類屬性),通過(guò)static開(kāi)頭的屬性,Person類可以訪問(wèn), ? ? 不需要?jiǎng)?chuàng)建實(shí)例,實(shí)例訪問(wèn)不到 */ ? static height = 180; ? /* 1.3、只讀屬性,readonly開(kāi)頭的屬性,只可讀,不可改*/ ? readonly money= 1000; ? ? //2、定義方法 ? ? say(){ ? ? ? console.log('hello world'); ? ? ? } ? static work(){ ? ? ? console.log('我能掙錢(qián)'); ? ? ? } } const per = new Person(); //per.money=2000 ?報(bào)錯(cuò),不可修改 console.log(per, Person.height); per.say() ?//調(diào)用實(shí)例方法 Person.work() //調(diào)用類方法
三、靜態(tài)方法使用:在方法前加上static關(guān)鍵字
1、為什么使用靜態(tài)方法
阻止方法被實(shí)例繼承,類的內(nèi)部相當(dāng)于實(shí)例的原型,所有在類中直接定義的方法相當(dāng)于在原型上定義方法,都會(huì)被類的實(shí)例繼承,但是使用static靜態(tài)方法定義的不會(huì)被實(shí)例繼承。
? class User{ ? ? ? ? ? ? static call(){ ? ? ? ? ? ? ? ?console.log('你好呀'); ? ? ? ? ? ? } ? ? ? ? } ? ? ? User.call()//你好呀 ? ? ? ? let ff = new User() ? ? ? ff.call()//報(bào)錯(cuò),實(shí)例不能訪問(wèn)類的靜態(tài)方法
這里類User可以直接使用call方法,但它的是實(shí)例ff卻不可以!
但是我們可以通過(guò)繼承的方式,讓另一個(gè)類來(lái)繼承User里面的方法
class User{ ? ? ? ? ? ? static call(){ ? ? ? ? ? ? ? ?console.log('你好呀'); ? ? ? ? ? ? } ? ? ? ? } ?? ?? ? ? ?class foo extends User{} ? ? ?foo.call()//'你好呀' ? ?
這里foo類通過(guò)繼承User類,才可以使用User里面的靜態(tài)方法。
我們知道class類這個(gè)概念是es6后出來(lái)的新特性,用以前的es5方法寫(xiě)就是:
?class User{ ? ? ? ? ? ? static call(){ ? ? ? ? ? ? ? ?console.log('靜態(tài)方法的你好呀'); ? ? ? ? ? ? } ? ? ? ? ? ? call(){ ? ? ? ? ? ? ? ?console.log('構(gòu)造函數(shù)方法的你好呀'); ? ? ? ? ? ? } ? ? ? ? } ? //等同于 function User(){} ? ? ?User.call=function(){ ? ? ? ? ?console.log('靜態(tài)方法的你好呀'); ? ? ?} ? ? ? ? User.prototype.call=function(){ ? ? ? ? ?console.log('構(gòu)造函數(shù)方法的你好呀'); ? ? ?}
但是User類里面的構(gòu)造函數(shù)方法是可以被實(shí)例調(diào)用的,如圖:
function User(){} User.prototype.call=function(){ ? ? ? ? ?console.log('你好呀'); ? ? ?} ? ? ?let h1 =new User() ? ? ?h1.call()//你好呀
完整版如下
class User { ? ? ? ? ? ? call() { ? ? ? ? ? ? ? ? // 這里面的this指向構(gòu)造函數(shù)的對(duì)象 ? ? ? ? ? ? ? ? console.log(this === hh); // true ? ? ? ? ? ? ? ? console.log("構(gòu)造函數(shù)方法的你好呀"); ? ? ? ? ? ? } ? ? ? ? ? ? static call() { ? ? ? ? ? ? ? ? // 這里面的this指向類本身 ? ? ? ? ? ? ? ? console.log(this === User); // true ? ? ? ? ? ? ? ? console.log("靜態(tài)方法的你好呀"); ? ? ? ? ? ? } ? ? ? ? } ? ? ? ? // 靜態(tài)方法 ? ? ? ? User.call(); //靜態(tài)方法的你好呀 ? ? ? ? ? // 構(gòu)造函數(shù)方法 ? ? ? ? let hh = new User(); ? ? ? ? hh.call(); //構(gòu)造函數(shù)方法的你好呀
三、總結(jié)
1、靜態(tài)屬性和非靜態(tài)屬性的區(qū)別
- 在內(nèi)存中存放的位置不同:所有static修飾的屬性和方法都存放在內(nèi)存的方法區(qū)里,而非靜態(tài)的都存在堆內(nèi)存中
- 出現(xiàn)的時(shí)機(jī)不同:靜態(tài)屬性和方法在沒(méi)創(chuàng)建對(duì)象之前就存在,而非靜態(tài)的需要在創(chuàng)建對(duì)象才存在
- 靜態(tài)屬性是整個(gè)類都公用的
- 生命周期不一樣,靜態(tài)在類消失后被銷毀,非靜態(tài)在對(duì)象銷毀后銷毀
- 用法:靜態(tài)的可以直接通過(guò)類名訪問(wèn),非靜態(tài)只能通過(guò)對(duì)象進(jìn)行訪問(wèn)
2.使用static的注意事項(xiàng)
- 帶靜態(tài)修飾符的方法只能訪問(wèn)靜態(tài)屬性
- 非靜態(tài)方法既能訪問(wèn)靜態(tài)屬性也能訪問(wèn)非靜態(tài)屬性
- 非靜態(tài)方法不能定義靜態(tài)變量
- 靜態(tài)方法不能使用this關(guān)鍵字
- 靜態(tài)方法不能調(diào)用非靜態(tài)方法,反之可以
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
javascript簡(jiǎn)寫(xiě)常用的12個(gè)技巧(可以大大減少你的js代碼量)
這篇文章主要跟大家分享了javascript簡(jiǎn)寫(xiě)常用的12個(gè)技巧,通過(guò)這12個(gè)技巧可以大大減少你的js代碼量,看懂一種是入門(mén),全懂就是大神,你能知道幾個(gè)呢?需要的朋友們下面跟著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)下吧。2017-08-08JS實(shí)現(xiàn)的定時(shí)器展示簡(jiǎn)單秒表、頁(yè)面彈框及跳轉(zhuǎn)操作完整示例
這篇文章主要介紹了JS實(shí)現(xiàn)的定時(shí)器展示簡(jiǎn)單秒表、頁(yè)面彈框及跳轉(zhuǎn)操作,結(jié)合實(shí)例形式分析了JavaScript時(shí)間函數(shù)及頁(yè)面元素動(dòng)態(tài)操作相關(guān)使用技巧,需要的朋友可以參考下2020-01-01javascript實(shí)現(xiàn)在下拉列表中顯示多級(jí)樹(shù)形菜單的方法
這篇文章主要介紹了javascript實(shí)現(xiàn)在下拉列表中顯示多級(jí)樹(shù)形菜單的方法,涉及javascript屬性菜單的定義、構(gòu)造及遍歷等技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-08-08JavaScript常用數(shù)組去重的方法及對(duì)比詳解
數(shù)組去重在面試和工作中都是比較容易見(jiàn)到的問(wèn)題。這篇文章主要是來(lái)測(cè)試多個(gè)方法,對(duì)下面這個(gè)數(shù)組的去重結(jié)果進(jìn)行分析討論,需要的可以參考一下2022-07-07JavaScript報(bào)錯(cuò):Uncaught TypeError: Cannot set&n
在 JavaScript 編程中,“Uncaught TypeError: Cannot set property ‘X’ of undefined” 是一種常見(jiàn)的錯(cuò)誤,這種錯(cuò)誤通常發(fā)生在試圖給一個(gè)未定義的對(duì)象的屬性賦值時(shí),本文介紹了JavaScript報(bào)錯(cuò)的解決方案,需要的朋友可以參考下2024-07-07深入淺析JavaScript中prototype和proto的關(guān)系
prototype,每一個(gè)函數(shù)對(duì)象都有一個(gè)顯示的prototype屬性,而proto每個(gè)對(duì)象都有一個(gè)名為_(kāi)proto_內(nèi)部隱藏屬性。本文給大家介紹JavaScript中prototype和proto的關(guān)系,需要的朋友參考下2015-11-11JS通過(guò)ajax + 多列布局 + 自動(dòng)加載實(shí)現(xiàn)瀑布流效果
這篇文章主要介紹了JS通過(guò)ajax + 多列布局 + 自動(dòng)加載來(lái)實(shí)現(xiàn)瀑布流效果,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值 ,需要的朋友可以參考下2019-05-05Javascript節(jié)點(diǎn)關(guān)系實(shí)例分析
這篇文章主要介紹了Javascript節(jié)點(diǎn)關(guān)系,實(shí)例分析了javascript操作父子節(jié)點(diǎn)及兄弟節(jié)點(diǎn)的相關(guān)技巧,需要的朋友可以參考下2015-05-05