ES6中的类:深入浅出的学习笔记
2023-09-03 06:39:13
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 代码更易于理解和维护。