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