亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

 更新時間:2022年10月13日 12:19:02   作者:燕穗子博客  
這篇文章主要介紹了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)文章

最新評論