面向對象程式設計是一個很流行也很讓人容易了解的方法。面向對象程式設計中的一個核心概念就是類,我們可以把事物都抽象成一個個的類來描述他們的資訊和行為。
我們把JavaScript稱為基于對象的語言,而不是面向對象的語言,它是一個基于prototype的語言。它的文法中沒有像Java之類典型面向對象語言中定義一個類的文法,我們要建立一個對新的對象的描述,可能會這樣寫:
function Person(name, age) {
this.name = name;
this.age = age;
this.walk = function () {
console.log("I'm walking...");
};
}
然後要根據這個對象描述建立一個新對象執行個體,就會這麼做:
var person = new Person('kevin', 18);
在ES6中,提供了一個更符合面向對象風格的類定義方式:使用class關鍵字,雖然它隻是一個文法糖,但是好歹看起來和主流面向程式設計的語言更一緻了。
上面的例子可以用
class
關鍵字改寫:
class Person {
constructor(name, age) {
this.name = name;
this.age = age;
}
walk() {
console.log("I'm walking...");
}
}
靜态方法
提供了
static
關鍵字在類中定義靜态方法:
class Person {
constructor(name, age) {
this.name = name;
this.age = age;
}
walk() {
console.log("I'm walking...");
}
static create(name, age) {
return new Person(name, age)
}
}
繼承
可以使用
extends
關鍵字讓目前類繼承另一個類的屬性和方法:
// 父類:形狀
class Shape {
constructor(name) {
this.name = name;
}
draw() {
console.log("drawing " + this.name);
}
}
//子類:圓形
class Circle extends Shape {
constructor() {
super('circle'); //調用父類的constructor
}
}
//子類:方形
class Rect extends Shape {
constructor() {
super('rect'); //調用父類的constructor
}
}
var circle = new Circle();
circle.draw(); //drawing circle
var rect = new Rect();
rect.draw(); //drawing rect