返回

ES6中的类:深入浅出的学习笔记

前端

ES6 的类本质上是一种语法糖,它的大部分功能在 ES5 中都可以实现。新的 class 写法只是让对象原型的写法更加清晰,更像面向对象编程的语法。类提供了封装、继承和多态性的概念,使 JavaScript 中的对象更加灵活、可重用和可维护。

类的定义:

在 JavaScript 中,类使用 class 来定义。一个简单的类定义如下:

class Person {
  constructor(name, age) {
    this.name = name;
    this.age = age;
  }

  speak() {
    console.log(`My name is ${this.name} and I am ${this.age} years old.`);
  }
}

类的构造函数在类名后用关键字 constructor 定义,它负责初始化类的实例。构造函数中的参数用于传递给类的实例。

类中的方法使用关键字 method 定义。方法可以访问类的实例变量和方法。

类的实例:

使用 new 关键字可以创建类的实例。例如:

const person1 = new Person('John', 30);
const person2 = new Person('Mary', 25);

person1 和 person2 是 Person 类的两个实例。它们都有自己的 name 和 age 属性,并可以调用 speak 方法。

类的继承:

ES6 中的类支持继承。子类可以使用 extends 关键字继承父类。例如:

class Student extends Person {
  constructor(name, age, grade) {
    super(name, age);
    this.grade = grade;
  }

  study() {
    console.log(`${this.name} is studying.`);
  }
}

Student 类继承了 Person 类。Student 类有自己的 grade 属性和 study 方法,还可以访问 Person 类的 name 和 age 属性,以及 speak 方法。

类的多态性:

多态性是指子类可以重写父类的方法。例如:

class Teacher extends Person {
  constructor(name, age, subject) {
    super(name, age);
    this.subject = subject;
  }

  teach() {
    console.log(`${this.name} is teaching ${this.subject}.`);
  }

  speak() {
    super.speak(); // 调用父类的方法
    console.log('I am a teacher.');
  }
}

Teacher 类继承了 Person 类,并重写了 speak 方法。当调用 Teacher 类实例的 speak 方法时,它将调用子类的方法,而不是父类的方法。

类的抽象类:

抽象类是不能被实例化的类。它们只能被子类继承。抽象类通常用于定义公共接口或抽象概念。例如:

abstract class Animal {
  constructor(name) {
    this.name = name;
  }

  speak() {
    throw new Error('This method must be implemented in a subclass.');
  }
}

Animal 类是一个抽象类,它定义了一个 speak 方法,但没有实现它。子类必须实现 speak 方法才能被实例化。

类的应用场景:

类在 JavaScript 中有很多应用场景,包括:

  • 对象建模:类可以用来对现实世界中的对象进行建模。例如,我们可以用类来表示人、动物、汽车等。
  • 数据封装:类可以将数据和行为封装在一起,使其更易于管理和维护。
  • 代码重用:类可以被其他类继承和重用,从而减少代码重复。
  • 面向对象编程:类支持面向对象编程的思想,使 JavaScript 代码更易于理解和维护。