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