昨天小編更新了一下關於es5中的類的處理,也順便將es5中類的知識和語法簡單回顧一下,今天小編將es6中的與類相關的語法和大家一起探討一下。在es6中,對類的實現主要是引入關鍵字class和extends。下面是一些例子。大家也可以關注我的微信公眾號,蝸牛全棧。
一、類的建立
class People{ constructor(name,age){ this.name = name this.age = age } showName(){ console.log(this.name) } } let p1 = new People("lilei",34) console.log(p1) // People{name:"lilei",age:34}
二、類的繼承
class People{ constructor(name,age){ this.name = name this.age = age } showName(){ console.log(this.name) } } let p1 = new People("lilei",34) console.log(p1) // People{name:"lilei",age:34} class Coder extends People{ constructor(name,age,company){ super(name,age) // 通過super關鍵字,裡面的引數是整合自父類 this.company = company } showConpany(){ console.log(this.company) } } let c1 = new Coder("hanmeimei",24,"AILI") console.log(c1) // Coder{name:"hanmeimei",age:24,company:"AILI"} c1.showConpany() // AILI c1.showName() // hanmeimei
三、通過get和set獲取和設定類的屬性
1、錯誤示範
class People{ constructor(name,age){ this.name = name this.age = age } get sex(){ // 當前屬性是隻讀的【get】 return "male" } set sex(val){ this.sex = val // 會反覆呼叫這個方法,不停的對sex屬性進行設定,進入死迴圈 } showName(){ console.log(this.name) } } let p1 = new People("lilei",34) console.log(p1) // People{name:"lilei",age:34} p1.sex = "female" // Maximum call stack size exceeded
2、正確示例
class People{ constructor(name,age){ this.name = name this.age = age this._sex = -1 // 為了防止死迴圈,引入新屬性 } get sex(){ // 屬性 return this._sex } set sex(val){ this._sex = val } showName(){ console.log(this.name) } } let p1 = new People("lilei",34) console.log(p1) // People{name:"lilei",age:34} p1.sex = "female" console.log(p1.sex) // male
從上面的例子可以看出,引入set和get之後,程式碼量反而增加了,這對於小編這麼懶的人來說是很難忍受的,後來去查閱資料,才知道這樣做還是有設計者的道理的,如果我沒記錯的話,java也存在類似的操作。引入這個主要是為了規範在設定和取值的時候的業務邏輯,簡單理解就是設定的時候,有設定時候的規則,獲取有返回值的規則,看看下面的例子能更清晰一些。
class People{ constructor(name,age){ this.name = name this.age = age this._sex = -1 // 為了防止死迴圈,引入新屬性 } get sex(){ // 屬性 根據_sex值不同返回不同資訊 if(this._sex == 1){ return "male" }else if(this._sex == 0){ return "female" }else{ return "error" } } set sex(val){ // 1表示male 0表示female 只有在設定值滿足條件才能設定進去 if(val == 0 || val == 1){ this._sex= val } } showName(){ console.log(this.name) } } let p1 = new People("lilei",34) let c1 = new Coder("hanmeimei",24,"AILI") console.log(p1) // People{name:"lilei",age:34} // p1.sex = 1 // console.log(p1.sex) // male // p1.sex = 0 // console.log(p1.sex) // female p1.sex = 666 console.log(p1.sex) // error c1.sex = 1 console.log(c1.sex) // female 子類也可以使用對應的規則
四、靜態方法和靜態屬性
1、靜態方法:通過static關鍵字實現
class People{ constructor(name,age){ this.name = name this.age = age } // 例項方法,通過例項物件呼叫 showName(){ console.log(this.name) } // 靜態方法,通過類直接呼叫 static getCount(){ return 5 } } let p1 = new People("lilei",34) p1.showName() // lilei People.getCount() // 5 p1.getCount() // 報錯:p1.getCount is not a function
2、靜態屬性:es6中沒有單獨規定靜態屬性的宣告方式,建議使用以下方式定義靜態屬性。
class People{ constructor(name,age){ this.name = name this.age = age this._sex = -1 // 為了防止死迴圈,引入新屬性 } get sex(){ // 屬性 if(this._sex == 1){ return "male" }else if(this._sex == 0){ return "female" }else{ return "error" } } set sex(val){ // 1表示male 0表示female if(val == 0 || val == 1){ this._sex= val } } showName(){ console.log(this.name) } static getCount(){ return 5 } } class Coder extends People{ constructor(name,age,company){ super(name,age) this.company = company } showConpany(){ console.log(this.company) } } People.count = 8 // 定義People中的靜態屬性 let p1 = new People("lilei",34) console.log(People.count) // 8 console.log(Coder.count) // 8 繼承自該類的子類也可以訪問“靜態屬性” console.log(typeof People) // function [es6中class只是es5中的類的語法糖]