在ES6之前,JavaScript通过原型链和构造函数实现面向对象编程中的类和继承。ES6引入了class
和extends
关键字,使得基于类的面向对象编程变得更加简洁和易于理解。
类(Classes)
类是一种特殊的函数,可以使用class
关键字进行定义。类支持基于原型的继承、构造函数、静态方法和实例方法。
class Person {
constructor(name, age) {
this.name = name;
this.age = age;
}
greet() {
console.log(`Hello, my name is ${this.name} and I am ${this.age} years old.`);
}
static info() {
console.log("This is a Person class.");
}
}
const john = new Person("John", 30);
john.greet(); // 输出: Hello, my name is John and I am 30 years old.
Person.info(); // 输出: This is a Person class.
在这个例子中,Person
类有一个构造函数constructor
和一个实例方法greet
。info
是一个静态方法,可以直接通过类来调用,而不是通过类的实例。
继承(Inheritance)
继承是面向对象编程的一个核心概念,它允许一个类(子类)继承另一个类(父类)的成员。在JavaScript中,可以使用extends
关键字实现继承。
class Student extends Person {
constructor(name, age, grade) {
super(name, age); // 调用父类的constructor
this.grade = grade;
}
study() {
console.log(`My name is ${this.name} and I am studying.`);
}
}
const alice = new Student("Alice", 20, "A");
alice.greet(); // 输出: Hello, my name is Alice and I am 20 years old.
alice.study(); // 输出: My name is Alice and I am studying.
在这个例子中,Student
类继承了Person
类。Student
的构造函数使用super
调用了父类Person
的构造函数。Student
类还添加了自己的方法study
。
注意事项
- 类的所有方法(包括构造函数)默认都是在严格模式下执行的。
- 类和模块的内部,默认就是严格模式,所以不需要使用
use strict
指令。 - 类不存在变量提升(Hoisting),这一点与函数不同。
通过使用类和继承,JavaScript开发者可以更直观地实现和管理对象原型和构造函数,从而提高代码的可读性和可维护性。