es6新增了一種定義對象實例的方法,使用class關鍵字定義類,與class相關的知識點也逐步火熱起來,但是部分理解起來相對抽象,簡單對class相關的知識點進行總結,更好的使用class。
關於類有兩個概念,1,類自身,;2,類的實例對象
總的來說:靜態的是指向類自身,而不是指向實例對象,主要是歸屬不同,這是靜態屬性的核心。
難點一:靜態方法的理解
class Foo { static classd() { return 'hello'; }
}
2、靜態方法
C++中,若類的方法前加了static關鍵字,則該方法稱為靜態方法,反之為實例方法。靜態方法為類所有,可以通過對象來使用,也可以通過類來使用。但一般提倡通過類名來使用,因為靜態方法只要定義了類,不必建立類的實例就可使用。靜態方法只能調用靜態變量。
定義
若類的方法前加了static關鍵字,則該方法稱為靜態方法,反之為非靜態方法。
為什么使用靜態方法
靜態方法的好處就是不用生成類的實例就可以直接調用。
static方法修飾的成員不再屬於某個對象,而是屬於它所在的類。只需要通過其類名就可以訪問,不需要再消耗資源反復創建對象。
在類第一次加載的時候,static就已經在內存中了,直到程序結束后,該內存才會釋放。
靜態方法中this指向:this指向類而不是類的實例
繼承相關:靜態方法可以被子類繼承, 構造方法不能被繼承。
1.調用父類的成員方法
父類
package expression; public class Computer { String SayHellow(){ return "welcome"; }
子類
package expression; public class Pad extends Computer{ String SayHellow(){ return "welcome"+"你好呀"; }
如果我要讓歡迎語“welcome”換為“薩瓦迪卡”,父類和子類都要修改,這時可以用super繼承關鍵字
package expression; public class Pad extends Computer{ String SayHellow(){ return super.SayHellow()+"你好呀"; }
2.調用父類的構造方法
package expression; public class Pad extends Computer{ public Pad(){ //初始化 super();//調用父類的構造方法 } String SayHellow(){ //調用父類的成員方法 return super.SayHellow()+"你好呀"; }
3.調用父類的屬性
package expression; public class Pad extends Computer{ public Pad(){ //調用父類的屬性 this.screen = super.screen;//this 和super 是一樣的,只不過this是本類,super是父類 } String SayHellow(){ //調用父類的成員方法 return super.SayHellow()+"你好呀"; } }
難點二:靜態屬性的理解,以及和實列屬性的區別
理解了靜態的本質就知道靜態屬性是class類自身的屬性
相對的實例屬性是指類的實例的屬性,調用時使用 new Foo().'屬性名'
語法
class 類名{ 方法名(){ //方法體 } } var 變量名 = new 類名()
定義實例屬性的方法
// 聲明一個類 class Stuen{ read(){ console.log('stuen read()...') } } // 實例化一個對象 var s1 = new Stuen() s1.read()
// 構造方法 class Student{ constructor(name,age,sex){ console.log('構造方法') // 實例屬性 this.name = name; this.age = age; this.sex = sex; } // 實列方法 read(){ console.log('student read()....'+this.name); } } // 實列化對象 var s1 = new Student('tom',20,'男') s1.read(); console.log(s1.name) console.log(s1.age) console.log(s1.sex)
總結:優勢與弊端
在一些系統中使用非常頻繁的方法都使用靜態方法可以提高系統性能
為了方便,不用實例化,但這樣程序編譯運行時就占用了系統資源
靜態的屬性和方法在程序啟動的時候,就全部裝入內存的,而不管這些方法、屬性以后有沒有用到。即使是沒有人再訪問程序,這部分內存仍然不會釋放。還有就是,所有訪問者看到的靜態屬性的數據幾乎都是一樣的,比如A用戶設置了UserName這個屬性,B用戶訪問的時候,得到的UserName仍然是A用戶設置的那個。這種特性,如果用在固定數據中,那不會有太大問題,比如連接字符串之類的。