📅  最后修改于: 2023-12-03 14:42:26.456000             🧑  作者: Mango
在面向对象编程(OOP)中,继承是实现代码复用和扩展的重要概念之一。在JavaScript中,我们可以使用原型继承或类继承来实现继承。
原型继承是JavaScript中实现继承的常见方式。JavaScript中的每个对象都有一个链接到它的原型对象(也称为 proto
)。当我们访问一个对象的属性时,如果该属性不存在于该对象本身,则会在原型链上查找该属性。
// 定义一个父类
function Animal(name) {
this.name = name;
}
// 在父类的原型上添加一个方法
Animal.prototype.sayName = function() {
console.log("My name is " + this.name);
}
// 定义一个子类
function Dog(name, breed) {
Animal.call(this, name);
this.breed = breed;
}
// 通过原型链实现继承
Dog.prototype = Object.create(Animal.prototype);
Dog.prototype.constructor = Dog;
// 在子类的原型上添加一个方法
Dog.prototype.bark = function() {
console.log("Woof!");
}
// 创建一个Dog的实例
var myDog = new Dog("Rufus", "Labrador Retriever");
// 调用父类的方法
myDog.sayName(); // 输出 "My name is Rufus"
// 调用子类的方法
myDog.bark(); // 输出 "Woof!"
在上面的代码中,我们定义了一个 Animal
父类和一个 Dog
子类。我们使用 Animal.call(this, name)
将 Animal
的构造函数应用于 Dog
子类中,以便我们可以通过 this
访问到 Animal
父类的属性。
我们使用 Object.create(Animal.prototype)
创建一个新对象,并将其原型设置为 Animal
父类的原型。然后,我们将这个新对象设置为 Dog
子类的原型,从而实现了从 Animal
父类到 Dog
子类的继承关系。
最后,我们向 Dog
子类的原型上添加了一个新方法 bark
。
ES6 引入了类的概念,可以更简单地实现面向对象编程中的继承。我们可以使用 extends
关键字来实现子类继承父类。
// 定义一个父类
class Animal {
constructor(name) {
this.name = name;
}
sayName() {
console.log("My name is " + this.name);
}
}
// 定义一个子类
class Dog extends Animal {
constructor(name, breed) {
super(name);
this.breed = breed;
}
bark() {
console.log("Woof!");
}
}
// 创建一个Dog的实例
let myDog = new Dog("Rufus", "Labrador Retriever");
// 调用父类的方法
myDog.sayName(); // 输出 "My name is Rufus"
// 调用子类的方法
myDog.bark(); // 输出 "Woof!"
在上面的代码中,我们使用 class
关键字来定义 Animal
父类和 Dog
子类。我们使用 extends
关键字来让 Dog
子类从 Animal
父类继承。
我们在 Dog
子类的 constructor
函数中使用 super(name)
调用 Animal
父类的构造函数,以便我们可以访问 Animal
父类的属性。
最后,我们向 Dog
子类中添加了一个新方法 bark
。
无论使用原型继承还是类继承,继承是实现代码复用和扩展的重要方法之一。需要注意的是,继承也可能导致代码结构复杂,需要谨慎使用以避免代码过度耦合。