欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

JS中關(guān)于Class類的靜態(tài)屬性和靜態(tài)方法

 更新時(shí)間:2022年10月13日 12:19:02   作者:燕穗子博客  
這篇文章主要介紹了JS中關(guān)于Class類的靜態(tài)屬性和靜態(tài)方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

一、類的兩個(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)文章

最新評(píng)論