据我所知,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
请详细解释,但详细说明带有注释的代码行和反思的概念,谢谢。
答案 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
属性不用于任何内部函数。但是,如果您的代码依赖于它,则必须将其设置为正确的值。