带有原型冗余对象的javascript继承

javascript inheritance with prototype - redundant object

本文关键字:javascript 继承 对象 冗余 原型      更新时间:2023-09-26

我正在阅读一篇关于JavaScript中继承的教程,其中有以下语句:

Rabbit类的对象要从Animal类继承,我们需要:

  1. 定义动物
  2. 定义Rabbit
  3. 从动物身上继承兔子:

    Rabbit.prototype=新动画()

他们说,这种方法的缺点是需要创建一个冗余对象。我不明白为什么我需要创建那个多余的对象?我尝试了以下操作,它在不创建冗余对象的情况下工作:

function Animal() {};
function Rabbit() {};
Rabbit.prototype = Animal.prototype
Animal.prototype.go = function() {alert("I'm inherited method"};
var r = new Rabbit();
r.go();

我在这里错过了什么?

您缺少的是,在您的代码中,RabbitAnimal共享完全相同的原型。如果您将eatCarrot方法添加到Rabbit,那么每隔一个Animal也会有该方法。

你使用的教程实际上有些过时了。子类化的首选方法是使用Object.create为Rabbit创建一个全新的prototype对象,该对象链接到Animal.prototype:

Rabbit.prototype = Object.create(Animal.prototype);
Rabbit.prototype.constructor = Rabbit;

请注意,这并不依赖于从Animal实例中对Rabbit进行子类化。

有关详细信息,请参阅MDN。

您的方法有一个严重的缺陷,最好通过一个例子来证明:

function Animal() {};
Animal.prototype.feed = function(){
  console.log("feeding")
};
function Rabbit() {this.teeth = 4};
Rabbit.prototype = Animal.prototype; // oops
Rabbit.prototype.feed = function(){
  if(this.teeth > 1){
    console.log("chewing")
  } else {
    throw "I have no teeth!"
  }
}
var leechworm = new Animal;
leechworm.feed(); //throws

由于leechwormAnimal,无论我们定义什么种类的动物,它都应该能够喂养,但由于Animal.prototype === Rabbit.prototypeAnimal.prototype.feedRabbit.prototype.feed相同。水蛭会抱怨他没有牙齿。