在代码学院学习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构造函数并传递numLegsfood的参数,因为它们对于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。

09-25 16:42