原型链继承

71 阅读2分钟

image.png

原型链继承

  • 原型链继承(Prototype Chain Inheritance)是 JavaScript 中一种基于原型的继承方式,通过设置对象的隐式原型(__proto__Object.setPrototypeOf())来实现。
  • 在原型链继承中,我们通过创建对象实例并将其原型设置为要继承的父对象的实例,从而实现继承父对象的属性和方法。

示例:

// 父类
function Animal(name) {
  this.name = name;
}

Animal.prototype.eat = function() {
  console.log(this.name + " is eating.");
};

// 子类
function Dog(name, breed) {
  this.breed = breed;
}

Dog.prototype = new Animal();

// 创建子类的实例
var dog = new Dog("Buddy", "Labrador");

console.log(dog.name); // 输出:Buddy
dog.eat(); // 输出:Buddy is eating.

  1. 在这个示例中,我们定义了一个父类 Animal,它具有一个 name 属性和一个 eat 方法。
  2. 然后,我们定义了一个子类 Dog,它具有一个 breed 属性。
  3. 通过将 Dog.prototype 设置为 new Animal(),我们将 Dog 的原型设置为一个 Animal 的实例。这样,Dog 的实例将继承 Animal 的属性和方法。
  4. 最后,我们创建了 Dog 的实例 dog,可以访问继承的属性 name,并调用继承的方法 eat()
  • 注: 在原型链继承中,对象实例通过原型链向上查找属性和方法。如果在子类的实例上找不到属性或方法,它会继续在父类的原型上查找,直到找到或者到达原型链的顶端。

优缺点:

优点:

  1. 简单易实现:原型链继承是 JavaScript 中最简单的继承方式之一,只需要设置对象的原型即可实现继承。
  2. 实现属性和方法的继承:子类实例通过原型链继承,可以直接访问父类的属性和方法,实现了代码的重用。

缺点:

  1. 属性共享和引用类型的问题:原型链继承会导致多个子类实例共享同一个父类的属性,当一个子类实例修改了继承的属性时,会影响其他子类实例。而对于引用类型的属性,所有子类实例将共享同一个引用,可能会出现意外的修改。
  2. 无法向父类传递参数:原型链继承无法在子类的构造函数中向父类的构造函数传递参数,因为父类的构造函数已经在原型链中调用,无法直接访问。
  3. 无法实现多继承:由于 JavaScript 中对象的原型链只能指向一个对象,无法同时继承多个父类的属性和方法。