JavaScript 类和继承
在现代JavaScript开发中,使用类和继承可以帮助我们更好地组织和管理代码,特别是在构建复杂的应用程序时。类提供了一种简洁的语法来创建对象和定义对象行为,而继承允许我们创建具有共享行为的对象。
创建类
ES6引入了class
关键字,用于创建类。一个类通常包含一个构造函数(constructor)和若干方法。
class Animal {
constructor(name) {
this.name = name;
}
speak() {
console.log(`${this.name} makes a noise.`);
}
}
构造函数与原型链
构造函数在实例化时被调用,负责初始化对象的属性。类的方法实际上存储在原型链上,使得所有实例都能共享这些方法。
const animal = new Animal('Lion');
animal.speak(); // 输出: Lion makes a noise.
在JavaScript中,除了构造函数之外,类还可以定义其他方法。这些方法并不直接存储在每个实例对象上,而是存储在一个特殊的对象——原型(prototype)上。原型是类的一个属性,它包含了一个类的所有实例共享的方法。当你调用一个实例的方法时,JavaScript引擎首先检查该实例是否拥有这个方法,如果没有,它会沿着原型链向上查找,直到找到这个方法为止。由于所有的实例共享同一个原型对象,因此它们也共享这些方法,这样可以节省内存空间。
继承与super关键字
继承允许我们基于现有类创建新类。在子类中,使用extends
关键字继承父类,并通过super
关键字调用父类的构造函数和方法。
class Dog extends Animal {
constructor(name, breed) {
super(name); // 调用父类构造函数
this.breed = breed;
}
speak() {
super.speak(); // 调用父类方法
console.log(`${this.name} barks.`);
}
}
在这个例子中,Dog
类继承了Animal
类,并在其构造函数中通过super
调用了父类的构造函数来设置name
属性。speak
方法不仅调用了Animal
类的speak
方法,还增加了新的行为。
完整代码示例
下面是一个综合示例,展示了如何使用类和继承来创建和扩展对象。
// 定义Animal类
class Animal {
constructor(name) {
this.name = name;
}
speak() {
console.log(`${this.name} makes a noise.`);
}
}
// 定义Dog类,继承自Animal类
class Dog extends Animal {
constructor(name, breed) {
super(name); // 调用父类的构造函数
this.breed = breed;
}
speak() {
super.speak(); // 调用父类的方法
console.log(`${this.name} barks.`);
}
}
// 创建Animal的实例
const lion = new Animal('Lion');
lion.speak(); // 输出: Lion makes a noise.
// 创建Dog的实例
const dog = new Dog('Rex', 'Labrador');
dog.speak(); // 输出: Rex makes a noise. Rex barks.