
原型链继承
- 原型链继承(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);
dog.eat();
- 在这个示例中,我们定义了一个父类
Animal,它具有一个 name 属性和一个 eat 方法。
- 然后,我们定义了一个子类
Dog,它具有一个 breed 属性。
- 通过将
Dog.prototype 设置为 new Animal(),我们将 Dog 的原型设置为一个 Animal 的实例。这样,Dog 的实例将继承 Animal 的属性和方法。
- 最后,我们创建了
Dog 的实例 dog,可以访问继承的属性 name,并调用继承的方法 eat()
- 注: 在原型链继承中,对象实例通过原型链向上查找属性和方法。如果在子类的实例上找不到属性或方法,它会继续在父类的原型上查找,直到找到或者到达原型链的顶端。
优缺点:
优点:
- 简单易实现:原型链继承是 JavaScript 中最简单的继承方式之一,只需要设置对象的原型即可实现继承。
- 实现属性和方法的继承:子类实例通过原型链继承,可以直接访问父类的属性和方法,实现了代码的重用。
缺点:
- 属性共享和引用类型的问题:原型链继承会导致多个子类实例共享同一个父类的属性,当一个子类实例修改了继承的属性时,会影响其他子类实例。而对于引用类型的属性,所有子类实例将共享同一个引用,可能会出现意外的修改。
- 无法向父类传递参数:原型链继承无法在子类的构造函数中向父类的构造函数传递参数,因为父类的构造函数已经在原型链中调用,无法直接访问。
- 无法实现多继承:由于 JavaScript 中对象的原型链只能指向一个对象,无法同时继承多个父类的属性和方法。