0

JavaScript での継承に関するチュートリアルを読んでいますが、次のステートメントがあります。

Rabbit クラスのオブジェクトが Animal クラスから継承するには、次のものが必要です。

  1. 動物の定義
  2. ウサギの定義
  3. Animal から Rabbit を継承する:

    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

あなたが見逃しているのは、あなたのコードでそれがあり、まったく同じプロトタイプRabbitAnimal共有していることです。メソッドを追加すると、他のすべての人にもそのメソッドが追加されます。eatCarrotRabbitAnimal

使用しているチュートリアルは、実際には多少古くなっています。代わりにサブクラス化するための推奨される方法は、 を使用して、Rabbit にチェーンするObject.create新しいオブジェクトを作成することです。prototypeAnimal.prototype

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

これは、 のインスタンスからをサブクラス化することに依存しないことに注意してください。RabbitAnimal

詳細については、 MDNを参照してください。

于 2013-08-28T10:34:16.910 に答える
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.prototypeAnimal.prototype.feedと同じRabbit.prototype.feedです。リーチワームは歯がないことを訴えます。

于 2013-08-28T10:33:30.933 に答える