iT邦幫忙

2022 iThome 鐵人賽

DAY 24
0
Modern Web

想轉職的鯊魚從零基礎開始學習JavaScript系列 第 24

想轉職的鯊魚從零基礎開始學習JavaScript Day-24 Classes 類別(一)

  • 分享至 

  • xImage
  •  

概述

class是創立物件的模板,並基於prototypes(原型)的概念設立。

我們可以自行定義一個class,我們可以透過這個class去建立一個或是多個新物件,而由這個class建立出來的物件都繼承了class相關的特性,可以運用這個class內部的constructor及methods 。

Syntax語法

依據ECMA的描述,class語法可以分成兩類,分別是ClassDeclaration(類別宣告)及ClassExpression(類別敘述),語法如下:

  1. ClassDeclaration(類別宣告)
    class BindingIdentifier ClassTail
    class ClassTail
  2. ClassExpression(類別敘述)
    class BindingIdentifier(opt) ClassTail

相信各位跟鯊魚一樣,對上面ECMA的語法敘述有著同樣的理解,就是看不懂

那就從MDN來收集資訊,

ClassDeclaration(類別宣告):此類最重要的一點,就是開頭會先宣告這是一個class,之後才是他的keyword with the name of the class(類別名稱)。

class 類別名稱 {
類別內容
}

ClassExpression:此類的關鍵在於用一個變數去乘載一個class的內容,這類的類別名稱,可有可無,如果有名稱,呼叫他的name的時候會出現class name,如果沒有名稱,呼叫他的name的時候則會用變數名稱當作名稱,會像下面那樣。

let 一個變數 = class 類別名稱(可省略) {
類別內容
}

constructor 初始化的內容建立

上面說到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

一句話,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後面的()很空,好像可以放東西進去。
沒錯,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

constructor-續2 帶著參數建立有預設值初始化的內容

經過上面的狀況,為了避免參數少給而出現問題,就把模組製作出一個當沒有參數輸入時,會出現預設值。

這時就要用我們的好朋友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天了,鐵人賽真的很難熬,想就由鐵人賽來打基礎的鯊魚有時候都會想要放棄,但是,安西教練說過,現在放棄必賽就結束了。

來跟鯊魚一起說:不要放棄。

鯊語錄

參考資料

ECMA-262
MDN-class
MDN-Logical_OR


上一篇
2022 iThome 鐵人賽 Day-23 命名規則-寫程式不僅是你一個人的戰場
下一篇
想轉職的鯊魚從零基礎開始學習JavaScript Day-25 Classes 類別(二)
系列文
想轉職的鯊魚從零基礎開始學習JavaScript31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

0
jadddxx
iT邦新手 5 級 ‧ 2022-10-10 15:16:13

鯊魚撐下去~一起加油!!

我成功撐下去啦

我要留言

立即登入留言