结合使用JS的Prototype和Constructor属性

Using the Prototype and Constructor Properties of JS in conjunction

本文关键字:Constructor 属性 Prototype JS 结合      更新时间:2023-09-26

根据我的理解,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

请解释清楚但详细的代码行与意见和反思的概念,谢谢。

Animal.call(this) 的用途是什么

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

在您的示例中,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属性没有在任何内部函数中使用。但是,如果您的代码依赖于它,则必须将它设置为正确的值。