天天看點

ES6特性之:類

面向對象程式設計是一個很流行也很讓人容易了解的方法。面向對象程式設計中的一個核心概念就是類,我們可以把事物都抽象成一個個的類來描述他們的資訊和行為。

我們把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