JavaScript ES6之前的還沒有Class類的概念,生成實例對象的傳統方法是通過構造函數。
例如:
1 function Mold(a,b){ 2 this.a=a; 3 this.b=b; 4 } 5 Mold.prototype.count=function(){ 6 return this.a+this.b; 7 }; 8 let sum=new Mold(1,2); 9 console.log(sum.count()) //3
這中寫法跟傳統的面向對象語言差異較大,寫起來也比較繁雜。
-
ES6提供了更加接近其他語言的寫法,引入了Class(類)的概念,作為對象的模板,可以通過class關鍵字,定義類(類似python、java等);
當然ES6的大部分功能再ES5都能實現,ES6的class
可以看作是一個語法糖,只是新的class
定義類的寫法讓對象原型的寫法更加簡單明了、更接近與面向對象的編程思想。與上面ES5寫的類使用ES6實現,例如:
1 class Mold{ 2 constructor(a,b){ 3 this.a=a; 4 this.b=b; 5 } 6 count(){ 7 return this.a+this.b; 8 } 9 } 10 let sum=new Mold(1,2); 11 console.log(sum.count()) //3
這里ES6的類,只需用
class
定義,並且類的方法不需要用function定義;還有ES6的constructor
方法,代表這該類的構造方法;並且它的this
關鍵字指向着實例對象。這里ES5的構造函數Mold,相當於ES6Mold類的constructor
方法。
-
constructor
-
- ES6實例對象的構造函數就是該類本身;並且當我們new 類名()就是執行了constructor這個函數。
例如:
1 class Mold{ 2 constructor(){ 3 console.log("aaa") 4 } 5 } 6 let m=new Mold();// aaa 7 console.log(m.constructor===Mold);//true
上面代碼Mold類的constructor,實例化對象時執行默認constructor
;
-
- 任何對象都有構造函數,並且構造函數與當前對象的類是相同;
例如:
1 let arr=new Array(); 2 console.log(arr.constructor===Array);//true 3 let str=new String(); 4 console.log(str.constructor===String);//true 5 let obj=new Object(); 6 console.log(obj.constructor===Object);//true
2. 類的繼承 extends
-
-
繼承父類后,子類會繼承父類所有的方法和屬性(包括靜態方法和屬性)
-
如果子類沒有定義
constructor
方法,會默認被添加該方法 -
任何子類都有
constructor
方法;
-
例如:
1 //class 類名 extends 被繼承的類{} 2 Class Father{ 3 constructor(){ 4 } 5 sum(){ 6 console.log("abc"); 7 } 8 static fn(){ 9 console.log("hello") 10 } 11 } 12 Class Son extends Father{ 13 14 } 15 let s=new Son(); 16 s.sum()//abc,繼承了父類的sum()方法 17 Son.fn()//hello 繼承了父類的靜態方法fn()
-
- 繼承后的子類方法的三種處理:
1). 完全繼承,不需要重寫這個方法,子類執行繼承方法內容與父類相同
2). 重寫覆蓋,只需要在這個類中重寫這個方法就可以覆蓋繼承過來的內容
3). 加工,子類可以用
super
調用父類的方法或屬性進行加工,再加上子類自己的方法和屬性
3. super
-
-
調用父類的構造函數直接使用
super()
,並且可以傳參; -
子類的構造函數中,只有調用了
super
之后才可以使用this
關鍵字,否則會報錯;
-
例如:
1 //super.父類函數(); 2 class Father{ 3 constructor(){ 4 console.log("bbb"); 5 } 6 } 7 class Son extends Father{ 8 constructor(x){ 9 this.x=x;//ReferenceError,報錯 10 super(); 11 this.x=x;//正確 12 } 13 } 14 let sum=new Son();//bbb
4. 類的static靜態
-
-
在屬性或方法前面使用
static
定義類的靜態屬性和方法; -
所有的靜態屬性和靜態方法都不能通過實例化的對象調用;
-
需要通過類來調用,靜態屬性和靜態方法是類的專屬屬性和方法,和實例化對象無關,比如數組和數學方法中的:
Array.from();Math.random()。
-
例如:
1 class Mold{ 2 static x=0; 3 y=1; 4 static fn1(){ 5 console.log("aaa") 6 } 7 fn2(){ 8 console.log("bbb"); 9 } 10 } 11 let m=new Mold(); 12 console.log(m.x,m.y);//undefined , 1 13 m.fn1(); // TypeError 14 m.fn2(); // bbb 15 //需要通過類來調用 16 Mold.fn1(); //aaa 17 console.log(Mold.x);//0
-
- 靜態的使用場景:
一般靜態的方法是用來解決一系列該類型的方法;
解決具體類型的方法,不是解決某個具體對象的方法
靜態屬性,一般用於存儲該類型的一系列通用的屬性變量
這種存儲,在類創建的時候就已經變成全局的了,可在任何地方調用,並且不會被自動銷毀