JS & ES6 -- 語法糖:類

類的聲明

舉個栗子:

class Cat{
    constructor(name){
        this.name = name // 這是私有屬性
    }

    eatFish() { // 不需要 function 關鍵字
        console.log('MiaoMiao')
    }
}

需要說明的是,類的聲明僅僅是個語法糖而已,嚐到了甜頭就不好戒的那種。233

使用ES6的類需要注意的問題
1、類的聲明不會被提升,這一點和 let/const 聲明變量的時候的規則類似——存在臨時性死區。


關於臨時性死區的一點說明:

if (condition) {
    console.log(typeof value) // 引用錯誤!
    let value = 'red'
}

由於 console 語句報錯,因此 let 定義 value 的語句並不會執行。這時的 value 就位於 JS 所謂的臨時性死區中( TDZ )。人們常用這個詞來描述 let 和 const 的不提升的效果。

但是有一種情況,並不會報錯,那就是 console 位於 let 聲明的作用域之外:

console.log(typeof value)

if (condition) {
    let value = 'red'
}

這種情況下,typeof 是在 value 的代碼塊之外執行的,此時,value 並不在 TDZ 中。
結論:TDZ 只是會計綁定的特色之一。


2、類聲明的所有代碼都將運行在嚴格模式中。

類的表達式

let Cat = class {
    constructor(name){
        this.name = name // 這是私有屬性
    }

    eatFish() { // 不需要 function 關鍵字
        console.log('MiaoMiao')
    }
}

類的聲明方式和表達式方式的一個重要的區別:

Cat.name // Cat --> 聲明形式
Cat.name // 空字符串 --> 表達式形式

當然,我們也可以命名類表達式,就好像給匿名函數命名:

let Cat = class ACat{
    constructor(name){
        this.name = name // 這是私有屬性
    }

    eatFish() { // 不需要 function 關鍵字
        console.log('MiaoMiao')
    }
}

但是這個ACat只能在類的定義之中被訪問,在類之外無法訪問。

作爲一等公民的類

總能說到一等公民,一等公民是什麼呢?
精確定義:一等公民是指一個可以傳入函數作爲參數,可以從函數返回,並且可以賦值給變量的值。

JS 中,函數是一等公民,ES6 中,類也是一等公民。

創建單例

let cat = new class {
    ...
}('CatMiMi')

靜態方法

class Cat{
    constructor(name){
        this.name = name // 這是私有屬性
    }

    eatFish() { // 不需要 function 關鍵字
        console.log('MiaoMiao')
    }

    static create(name){
        return new Cat(name) // 訪問方法:Cat.create('cat0') --> 直接用類訪問
    }
}

可計算成員名稱 與 訪問器屬性

let name = 'eatFish'
class Cat{
    constructor(name, food){
        this.name = name
        this.food = food
    }

    [name]() { // 可計算成員名稱
        console.log('MiaoMiao')
    }

    get food(){
        return this.food
    }

    set food(food){
        this.food = food
    }
}
發佈了344 篇原創文章 · 獲贊 39 · 訪問量 31萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章