在JavaScript中,类(Class)是对象的模板,允许定义对象的行为和状态。ES6(ECMAScript 2015)引入了类的概念,提供了一种新的、更接近传统面向对象编程语言的语法来创建对象。

定义类

使用类声明

 1class Person {
 2  constructor(name, age) {
 3    this.name = name;
 4    this.age = age;
 5  }
 6
 7  greet() {
 8    console.log(`Hello, my name is ${this.name} and I am ${this.age} years old.`);
 9  }
10}
11
12const john = new Person('John', 30);
13john.greet(); // 输出:Hello, my name is John and I am 30 years old.
  • constructor 是一个特殊的方法,当创建类的新实例时自动调用。
  • this 关键字在构造函数中指向新创建的对象实例。

使用类表达式

 1const Person = class {
 2  constructor(name, age) {
 3    this.name = name;
 4    this.age = age;
 5  }
 6
 7  greet() {
 8    console.log(`Hello, my name is ${this.name} and I am ${this.age} years old.`);
 9  }
10};
11
12const jane = new Person('Jane', 25);
13jane.greet(); // 输出:Hello, my name is Jane and I am 25 years old.

继承

JavaScript中的类可以使用extends关键字实现继承。

 1class Employee extends Person {
 2  constructor(name, age, jobTitle) {
 3    super(name, age); // 调用父类的constructor(name, age)
 4    this.jobTitle = jobTitle;
 5  }
 6
 7  describe() {
 8    console.log(`${this.name} is a ${this.age} year old ${this.jobTitle}.`);
 9  }
10}
11
12const employee = new Employee('Alice', 28, 'Developer');
13employee.describe(); // 输出:Alice is a 28 year old Developer.

静态方法

静态方法是类的方法,不是实例的方法,可以通过类本身调用,而不是通过实例。

1class MathUtils {
2  static add(a, b) {
3    return a + b;
4  }
5}
6
7const result = MathUtils.add(5, 3); // 输出:8

getter 和 setter

可以定义getter和setter来控制对对象属性的访问和修改。

 1class Person {
 2  constructor(name) {
 3    this._name = name;
 4  }
 5
 6  get name() {
 7    return this._name;
 8  }
 9
10  set name(value) {
11    this._name = value;
12  }
13}
14
15const person = new Person('John');
16console.log(person.name); // 输出:John
17person.name = 'Jane'; // 设置名字
18console.log(person.name); // 输出:Jane

私有字段和方法

在ES2022中,可以使用#前缀来定义私有字段和方法。

 1class Person {
 2  #name;
 3  constructor(name) {
 4    this.#name = name;
 5  }
 6
 7  get name() {
 8    return this.#name;
 9  }
10
11  set name(value) {
12    this.#name = value;
13  }
14
15  greet() {
16    console.log(`Hello, my name is ${this.#name}.`);
17  }
18}
19
20const person = new Person('John');
21person.greet(); // 输出:Hello, my name is John.
22console.log(person.name); // 输出:John
23person.name = 'Jane'; // 设置名字
24person.greet(); // 输出:Hello, my name is Jane.

总结

JavaScript中的类提供了一种强大的方式来封装数据和行为,支持继承、静态方法、私有字段和方法等面向对象编程特性。通过类,可以创建具有清晰结构和行为的复杂对象。