回到课程
本资料仅提供以下语言版本:。请 帮助我们 将其翻译为 简体中文 版本。

继承中的错误

重要程度: 5

在下面的原型继承中找到一个错误。

怎么了?后果将是什么?

function Animal(name) {
  this.name = name;
}

Animal.prototype.walk = function() {
  alert(this.name + ' walks');
};

function Rabbit(name) {
  this.name = name;
}

Rabbit.prototype = Animal.prototype;

Rabbit.prototype.walk = function() {
  alert(this.name + " bounces!");
};

这里有一行报错代码:

Rabbit.prototype = Animal.prototype;

这里 Rabbit.prototypeAnimal.prototype 变成了同样的对象。所以这两个类的方法都混合在了这个对象中。

结果,Rabbit.prototype.walk 重写了 Animal.prototype.walk,所以所有动物都开始跳:

function Animal(name) {
  this.name = name;
}

Animal.prototype.walk = function() {
  alert(this.name + ' walks');
};

function Rabbit(name) {
  this.name = name;
}

Rabbit.prototype = Animal.prototype;

Rabbit.prototype.walk = function() {
  alert(this.name + " bounces!");
};

let animal = new Animal("pig");
animal.walk(); // 猪跳!

正确的变体是:

Rabbit.prototype.__proto__ = Animal.prototype;
// or like this:
Rabbit.prototype = Object.create(Animal.prototype);

这使原型分开,每个原型都存储相应类的方法,但是 Rabbit.prototype 继承自 Animal.prototype