3

为什么this.name = name;在企鹅和皇帝类中,为什么被this.numLegs = numLegs;排除在外?是因为您可以设置这些属性(如果有的话)?

// original classes
function Animal(name, numLegs) {
    this.name = name;
    this.numLegs = numLegs;
    this.isAlive = true;
}
function Penguin(name) {
    this.name = name;
    this.numLegs = 2;
}
function Emperor(name) {
    this.name = name;
    this.saying = "Waddle waddle";
}

// set up the prototype chain
Penguin.prototype = new Animal();
Emperor.prototype = new Penguin();

var myEmperor = new Emperor("Jules");

//console.log(myEmperor.saying); // should print "Waddle waddle"
//console.log(myEmperor.numLegs); // should print 2
//console.log(myEmperor.isAlive); // should print true
console.log(myEmperor.name);
4

3 回答 3

1

第一类,Animal 代表通用动物。有些动物有 2 条腿,有些有 4 条腿,所以当你实例化一个通用动物时,你需要说出它有多少条腿。这就是将 numLegs 参数传递给构造函数的原因。

var fluffyTheCat = new Animal('Fluffy', 4);

第二类只代表企鹅,众所周知,所有企鹅都有两条腿。你不需要说企鹅有多少条腿,所以不要说:

var pingyThePenguin = new Animal('Pingy', 2);

你可以说:

var pingyThePenguin = new Penguin('Pingy');

帝王是特殊的企鹅,与普通企鹅不同,它也有一种说法。但是它们都有相同的说法,因此您也不需要将其传递给构造函数。


有点题外话

您示例中的继承略有损坏。您不必实例化基类来获取继承基类的原型。具体来说:

Penguin.prototype = new Animal();

不知何故坏了。

相反,您可以执行以下操作:

Penguin = new function(name) {
  // inherits from Animal
  Animal.call(this, name,2);
}

Penguin.prototype = Object.create(Animal.prototype);

Emperor = new function(name) {
  // inherits from Penguin
  Penguin.call(this, name);      
  this.saying = "Waddle waddle";
}

Emperor.prototype = Object.create(Penguin.prototype);
于 2013-10-14T11:30:18.193 回答
0

第一个被称为Animal是通用的,所以它可以有很多不同的腿,在另一个Penguin井中企鹅有两条腿,这就是原因,最后一个Emperor不是动物,也没有创造动物,这就是它没有创造的原因任何腿。

于 2013-10-14T11:38:23.817 回答
0

你使用这个功能

var myEmperor = new Emperor("Jules");

它给出了名字,但你没有初始化numlegs

例子 :

var myEmperor =new Penguin('ss');
于 2013-10-14T11:19:44.183 回答