在代码学院学习JS,对第18/30课中有关继承的某些技术感到困惑。
企鹅是动物的子类。
我将Penguin的原型设置为Animal,然后在Penguin构造函数中指定其numLegs。但是,我没有指定其名称和食物,这是Animal类的属性。
Penguin构造函数仅使用1个参数name,而Animal构造函数采用3:name,food和numLegs。
例如,如果我创建一个名为“ Bob”的新企鹅对象,其numLegs和food将是什么?
// the original Animal class and sayName method
function Animal(name, numLegs, food) {
this.name = name;
this.numLegs = numLegs;
this.food = food;
}
Animal.prototype.sayName = function() {
console.log("Hi my name is " + this.name);
};
// define a Penguin class
function Penguin(name)
{
this.numLegs=2;
this.name=name;
}
// set its prototype to be a new instance of Animal
Penguin.prototype=new Animal();
最佳答案
food
是在Animal()
构造函数中使用传递给它的三个参数调用时初始化的属性。由于您永远不会用这些参数那样调用构造函数,并且永远都不会在food
构造函数中设置Penguin
属性,因此该属性将是undefined
(从不设置)。numLegs
属性的值将为2
,因为您的Penguin
构造函数始终将其设置为2
。name
属性将被设置,因为您是在Penguin
构造函数中对其进行设置的。这里只有一个物体。这不像是对象的Penguin
部分和对象的Animal
部分。只有一个对象和一组属性。无论在何处设置属性(使用哪个构造函数或哪种方法),都将在对象上对其进行设置。
继承的常用方法是为Penguin
创建一个构造函数,该构造函数包括初始化对象所需的所有属性(或子类手动设置一些参数本身),然后在Penguin
构造函数中,调用基础对象,并向其传递期望的参数。
这是一种实现方法,其中Penguin
构造函数调用Animal
构造函数并传递numLegs
和food
的参数,因为它们对于Penguin
是已知的,因此不需要用Penguin
构造函数传递。
function Animal(name, numLegs, food) {
this.name = name;
this.numLegs = numLegs;
this.food = food;
}
Animal.prototype.sayName = function() {
console.log("Hi my name is " + this.name);
};
// define a Penguin class
function Penguin(name) {
// call parent constructor with this object and all three args it wants
// so all the object properties get initialized appropriately
Animal.call(this, name, 2, "fish");
}
// set its prototype to be a new instance of Animal
Penguin.prototype = new Animal();
仅供参考,设置原型的更现代方法是:
Penguin.prototype = Object.create(Animal.prototype);
这样可以避免构造函数的任何副作用,而只是复制所需的原型。
Object.create()
需要IE9或简单的polyfill。