class是創立物件的模板,並基於prototypes(原型)的概念設立。
我們可以自行定義一個class,我們可以透過這個class去建立一個或是多個新物件,而由這個class建立出來的物件都繼承了class相關的特性,可以運用這個class內部的constructor及methods 。
依據ECMA的描述,class語法可以分成兩類,分別是ClassDeclaration(類別宣告)及ClassExpression(類別敘述),語法如下:
相信各位跟鯊魚一樣,對上面ECMA的語法敘述有著同樣的理解,就是看不懂。
那就從MDN來收集資訊,
ClassDeclaration(類別宣告):此類最重要的一點,就是開頭會先宣告這是一個class,之後才是他的keyword with the name of the class(類別名稱)。
class 類別名稱 {
類別內容
}
ClassExpression:此類的關鍵在於用一個變數去乘載一個class的內容,這類的類別名稱,可有可無,如果有名稱,呼叫他的name的時候會出現class name,如果沒有名稱,呼叫他的name的時候則會用變數名稱當作名稱,會像下面那樣。
let 一個變數 = class 類別名稱(可省略) {
類別內容
}
上面說到class是一個模組,是一個創建物件用的模組,而模組的內部(也就是上面說的類別內容)就必須要由constructor來建立。
首先建立一個class people,
class people {
}
每個people,一開始就給他現金10萬、存款10萬、交通方式:機車、房地產0,就會像這樣。
constructor(){
this.property = 100000;
this.deposit = 100000;
this.realEstate = 0;
thus.mobileWay = "moto"
}
然後把他們放進class裡面,就會向下面這樣
class people {
constructor(){
this.property = 200000;
this.deposit = 200000;
this.mobileWay = "moto"
this.realEstate = 0;
}
}
之後就可以用這個class people來創建人物,
let goldBaby = new people;
goldBaby
// people {property: 200000, deposit: 200000, mobileWay: 'moto', realEstate: 0}
一句話,this=呼叫他的物件,
上面class長這樣
class people {
constructor(){
this.property = 200000;
this.deposit = 200000;
this.mobileWay = "moto";
this.realEstate = 0;
}
}
誰呼叫他,this就變誰,
let goldBaby = new people;
上面是goldBaby用一個class people建立的物件,但同時goldBaby也是呼叫people的人,所以誰呼叫他,this就變誰,所以
this.property = 200000;
就會變成
goldBaby.property = 200000
上面說的constructor,可以平等建立的開始,但是在很多狀況下,我們會希望建立出來的物件,可以個別賦予初始值,就像是世●帝●每個種族初始條件就不一樣,這時候,我們就會希望模板一樣,但是值可以自由調整,不知道你有沒有注意到,constructor後面的()很空,好像可以放東西進去。
沒錯,constructor後面的()就是給我們放自定義的參數進去的,
於是我們的模組就變成了這樣,可以自行決定property現金、deposit存款、跟mobileWay移動方式。
class people {
constructor(property,deposit,mobileWay){
this.property = property;
this.deposit = deposit;
this.mobileWay = mobileWay;
this.realEstate = 0;
}
}
創建新物件的時候記得把參數放進去,如果沒放,相關的值會出現undefined
let tuuUncle = new people(100000,100000)
tuuUncle
//people {property: 100000, deposit: 100000, mobileWay: undefined, realEstate: 0}
因為沒給第三個參數所以mobileWay的值出現undefined
經過上面的狀況,為了避免參數少給而出現問題,就把模組製作出一個當沒有參數輸入時,會出現預設值。
這時就要用我們的好朋友Logical OR (||) 運算子OR
運算子OR(||)會回傳true的選項,
把剛剛的constructor運用運算子OR(||)改建一下變成
當沒有參數傳進property的時候,就會被判定false,就會使用後面的值(有值就會被判定是true),也就是預設值。
this.property = property || 200000;
於是我們的constructor變成這樣
class people {
constructor(property,deposit,mobileWay){
this.property = property || 200000;
this.deposit = deposit || 200000;
this.mobileWay = mobileWay || "moto"
this.realEstate = 0;
}
}
let hsiaoMei = new people(300000,300000)
hsiaoMei
//people {property: 300000, deposit: 300000, mobileWay: 'moto', realEstate: 0}
就完成有預設值的class了。
class好難,鯊魚看了好久還是霧霧的,看不懂的東西是最耗精神跟體力的了,目前還只說了一部分,還有一部分要逐步理解,已經24天了,鐵人賽真的很難熬,想就由鐵人賽來打基礎的鯊魚有時候都會想要放棄,但是,安西教練說過,現在放棄必賽就結束了。
來跟鯊魚一起說:不要放棄。
參考資料