📜  JavaScript OOP继承(1)

📅  最后修改于: 2023-12-03 14:42:26.456000             🧑  作者: Mango

JavaScript OOP继承

在面向对象编程(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

总结

无论使用原型继承还是类继承,继承是实现代码复用和扩展的重要方法之一。需要注意的是,继承也可能导致代码结构复杂,需要谨慎使用以避免代码过度耦合。