和其它面向對象編程語言一樣,ES6 正式定義了 class 類以及 extend 繼承語法糖,并且支持靜態、派生、抽象、迭代、單例等,而且根據 ES6 的新特性衍生出很多有趣的用法。
一、類的基本定義
基本所有面向對象的語言都支持類的封裝與繼承,那什么是類?
類是面向對象程序設計的基礎,包含數據封裝、數據操作以及傳遞消息的函數。類的實例稱為對象。
ES5 之前通過函數來模擬類的實現如下:
// 構造函數function Person(name) { this.name = name;}// 原型上的方法Person.prototype.sayName = function(){ console.log(this.name);};// new 一個實例var friend = new Person("Jenny");friend.sayName(); // Jennyconsole.log(friend instanceof Person); // trueconsole.log(friend instanceof Object); // true總結來說,定義一個類的思路如下:
1.需要構造函數封裝數據
2.在原型上添加方法操作數據,
3.通過New創建實例
ES6 使用class關鍵字定義一個類,這個類有特殊的方法名[[Construct]]定義構造函數,在 new 創建實例時調用的就是[[Construct]],示例如下:
/*ES6*/// 等價于 let Person = class {class Person { // 構造函數 constructor(name) { this.name = name; } // 等價于Person.prototype.sayName sayName() { console.log(this.name); }}console.log(typeof Person); // functionconsole.log(typeof Person.prototype.sayName); // functionlet friend = new Person("Jenny");friend.sayName(); // Jennyconsole.log(friend instanceof Person); // trueconsole.log(friend instanceof Object); // true上面的例子中class定義的類與自定義的函數模擬類功能上貌似沒什么不同,但本質上還有很大差異的:
函數聲明可以被提升,但是class類聲明與let類似,不能被提升; 類聲明自動運行在嚴格模式下,“use strict”; 類中所有方法都是不可枚舉的,enumerable 為 false。二、更靈活的類
類和函數一樣,是JavaScript的一等公民(可以傳入函數、從函數返回、賦值),并且注意到類與對象字面量還有更多相似之處,這些特點可以擴展出類更靈活的定義與使用。
2.1 擁有訪問器屬性
對象的屬性有數據屬性和訪問屬性,類中也可以通過get、set關鍵字定義訪問器屬性:
class Person { constructor(name) { this.name = name; } get value () { return this.name + this.age } set value (num) { this.age = num }}let friend = new Person("Jenny");// 調用的是 setterfriend.value = 18// 調用的是 getterconsole.log(friend.value) // Jenny182.2 可計算的成員名稱
類似 ES6 對象字面量擴展的可計算屬性名稱,類也可以用[表達式]定義可計算成員名稱,包括類中的方法和訪問器屬性:
新聞熱點
疑難解答
圖片精選