0

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

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

请清楚但详细地解释带有注释的代码行和反射的概念,谢谢。

4

1 回答 1

1

目的是什么Animal.call(this)

这就像调用super()其他编程语言一样。Animal它在刚刚创建的新对象 ( ) 上调用父构造函数( this)。MDN 文档.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属性未在任何内部函数中使用。但是,如果您的代码依赖它,则必须将其设置为正确的值。

于 2013-02-22T14:14:00.057 回答