JavaScript保留字——class
class是JavaScript的一個(gè)保留字,用來定義一個(gè)類。類是ES6引入的面向?qū)ο缶幊痰男绿匦灾弧?/p>
在ES6之前,我們使用構(gòu)造函數(shù)來創(chuàng)建對(duì)象,構(gòu)造函數(shù)內(nèi)部使用this關(guān)鍵字來表示對(duì)象,使用原型鏈來進(jìn)行繼承。而使用class關(guān)鍵字則可以更方便、更直觀地創(chuàng)建對(duì)象,并且還可以定義靜態(tài)方法、getter和setter等特性。
class Animal { constructor(name, type) { this.name = name; this.type = type; } speak() { console.log(this.name + " is speaking."); } static info() { console.log("This is a class."); } get info() { return this.type; } set info(value) { this.type = value; } } var dog = new Animal("Max", "dog"); dog.speak(); // Max is speaking. Animal.info(); // This is a class. console.log(dog.info); // dog dog.info = "cat"; console.log(dog.info); // cat
上面的例子中,我們定義了一個(gè)Animal類,其中constructor是類的構(gòu)造函數(shù),speak是實(shí)例方法,static用來定義靜態(tài)方法,get和set則是屬性的getter和setter方法。我們可以通過new關(guān)鍵字創(chuàng)建一個(gè)類的實(shí)例,讓這個(gè)實(shí)例繼承類的所有屬性和方法。
需要注意的是,class只是JavaScript中的一種語法糖,它實(shí)際上是一個(gè)函數(shù)。我們可以使用typeof運(yùn)算符來判斷它的類型。
class Test {} console.log(typeof Test); // function
此外,類的定義中也有一些限制。例如,類的方法內(nèi)部不允許使用this關(guān)鍵字來引用類的實(shí)例,否則會(huì)拋出錯(cuò)誤。
class Person { constructor(name) { this.name = name; // 報(bào)錯(cuò) } sayName() { console.log(this.name); } } var p = new Person("Jane"); p.sayName(); // 報(bào)錯(cuò)
在這個(gè)例子中,我們定義了一個(gè)Person類,但是在構(gòu)造函數(shù)和實(shí)例方法中都使用了this關(guān)鍵字,會(huì)導(dǎo)致報(bào)錯(cuò)。如果我們想要獲取實(shí)例的屬性,可以通過類的構(gòu)造函數(shù)來實(shí)現(xiàn)。
class Person { constructor(name) { this._name = name; } get name() { return this._name; } set name(value) { this._name = value; } sayName() { console.log(this.name); } } var p = new Person("Jane"); p.sayName(); // Jane p.name = "Tom"; p.sayName(); // Tom
在這個(gè)例子中,我們使用了一個(gè)私有屬性來存儲(chǔ)類的實(shí)例,并且通過getter和setter方法來獲取和設(shè)置實(shí)例的屬性。在實(shí)例方法中,使用this.name就可以獲取實(shí)例的屬性值。
總之,class是JavaScript中的一個(gè)關(guān)鍵字,用來定義一個(gè)類,可以更方便、直觀地進(jìn)行面向?qū)ο缶幊獭P枰⒁獾氖牵惖姆椒▋?nèi)部不能使用this關(guān)鍵字,如果想要獲取實(shí)例的屬性則需要通過getter和setter方法來實(shí)現(xiàn)。