ES6中的類
4.1、class基本語法
在之前的javascript語法中是不存在class這樣的概念,如果要通過建構函式生成一個新物件程式碼
function Shape(width,height){
this.width = width;
this.height = height;
}
Point.prototype.toString = function () {
return '(' + this.width + ', ' + this.height + ')';
}
ES6提供了更接近傳統語言的寫法,引入了Class(類)這個概念,作為物件的模板。通過class關鍵字,可以定義類。基本上,ES6的class可以看作只是一個語法糖,它的絕大部分功能,ES5都可以做到,新的class寫法只是讓物件原型的寫法更加清晰、更像物件導向程式設計的語法而已。上面的程式碼用ES6的“類”改寫,就是下面這樣。
//定義類
class Shape {
constructor(width, height) {
this.height = height;
this.width = width;
}
toString() {
return '(' + this.width + ', ' + this.height + ')';
}
}
通過class定義類名,constructor關鍵字定義建構函式。
4.2、繼承與多型
繼承與多型是物件導向最重要的兩個特性,通過繼承可以實現程式碼的重構,在之前的javascript中繼承需要通過原型鏈來實現,而在ES6中可以通過extends關鍵字直觀的實現繼承。首先定義基類Shape,定義子類Rect整合與基類並重寫方法toArea實現多型。
'use strict'
class Shape {
constructor(width,height){
this.width=width;
this.height=height;
}
/***
* 獲取面積
* @returns {number}
*/
toArea(){
return this.width*this.height
}
}
module.exports = Shape;
'use strict'
var Shape = require('./Shape');
class Rect extends Shape {
constructor(width, height) {
super(width, height);
}
toArea() {
return this.width*this.height*2
}
}
module .exports = Rect;
子類Rect整合與基類Shape,擁有了基類的方法toArea,和屬性width與height,而子類通過相同的方法名重寫了方法toArea。
var sharp = new Sharp(1,2);
var rect = new Rect(1,2);
console.log(sharp.toArea());
console.log(rect.toArea());
====
2
4
4.3、類的靜態方法
ES6中的類提供靜態方法,靜態方法只能在類成員下呼叫,如果類例項化後再呼叫會丟擲異常。同樣的基類定義的靜態方法能被子類所繼承。靜態方法通過static關鍵字定義。
'use strict'
class Shape {
constructor(width,height){
this.width=width;
this.height=height;
}
/***
* 獲取面積
* @returns {number}
*/
toArea(){
return this.width*this.height
}
/**
* 靜態方法
* @returns {string}
*/
static toName(){
return 'shape'
}
}
module.exports = Shape;
console.log(Rect.toName());
===
shape
值得注意的是在ES6的類中並沒有靜態屬性的概念。靜態屬性可以通過Shape.name這樣來定義。