结合使用JS的Prototype和Constructor属性

时间:2013-02-22 13:47:05

标签: javascript

据我所知,Prototype对象是一个对象,其他对象从该对象继承属性和方法,并且基本上它包含一个构造函数属性,该属性引用或指向创建Object的构造函数。请考虑以下代码:

function Animal()
{
this.name="no name";
}

function Cat()
{
    Animal.Call(this);          //Please Explain
    this.mood="sleepy";
}

Cat.prototype=new Animal();     //Cat inheriting Animal?
Cat.prototype.constructor=Cat;  //Please Explain

请详细解释,但详细说明带有注释的代码行和反思的概念,谢谢。

1 个答案:

答案 0 :(得分:1)

  

Animal.call(this)

的目的是什么?

就像在其他编程语言中调用super()一样。它在刚刚创建的新对象(Animal)上调用父构造函数(this)。这也在MDN documentation about .call中解释。

在您的示例中,Animal"no name"分配给this.name。因此,在致电Animal.call(this);后,this将拥有具有上述价值的name属性。

  

Cat.prototype.constructor=Cat;

默认情况下,每个原型的constructor属性都指向它所属的函数。但是,由于您使用Cat.prototype=new Animal();覆盖原型,constructor属性现在指向不同的函数。在这种情况下,由于new Animal返回继承自Animal.prototype的对象,Cat.prototype.constructor将指向Animal。要解决此问题,我们会再次指定Cat

严格地说,这不是必需的,因为constructor属性不用于任何内部函数。但是,如果您的代码依赖于它,则必须将其设置为正确的值。