javascript继承为什么属性遗漏了?

时间:2013-10-14 11:07:52

标签: javascript

企鹅和皇帝课程中为什么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);

3 个答案:

答案 0 :(得分:1)

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

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

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

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);

答案 1 :(得分:0)

您使用此功能

var myEmperor = new Emperor("Jules");

其中提供了名称,但您没有初始化numlegs

示例:

var myEmperor =new Penguin('ss');

答案 2 :(得分:0)

第一个名为Animal的是普遍的,所以它可以有很多不同的腿,在另一个Penguin井企鹅有2条腿,这就是原因,最后一条{{1不是动物,也不是创造动物,这就是为什么它不会创造任何腿。