類的聲明
舉個栗子:
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
}
}