企鹅和皇帝课程中为什么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);
答案 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不是动物,也不是创造动物,这就是为什么它不会创造任何腿。