0

我正在阅读关于 JavaScript 中继承的教程,并且有以下声明:

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

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

    Rabbit.prototype = new Animal()

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

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

我在这里想念什么?

4

2 回答 2

3

你的方法有一个严重的缺陷,最好用一个例子来证明:

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

因为leechworm是一个Animal,不管我们定义什么样的动物,它都应该可以喂食,但是因为Animal.prototype === Rabbit.prototype,和Animal.prototype.feed是一样的Rabbit.prototype.feed。水蛭会抱怨自己没有牙齿。

于 2013-08-28T10:33:30.933 回答
3

您缺少的是您的代码,RabbitAnimal共享完全相同的原型。如果您向其中添加了一个eatCarrot方法,Rabbit那么其他Animal所有人也将拥有该方法。

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

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

请注意,这依赖Rabbit从.Animal

有关更多信息,请参阅MDN

于 2013-08-28T10:34:16.910 回答