无法理解<x> .prototype.constructor?</x>

时间:2013-07-18 06:29:23

标签: javascript

我有两个班级CarMaruti。当我通过将Maruti的原型分配给新的Car对象来使用继承时。为什么我必须将Maruti.prototype.constructor设置为Maruti。如下面的代码所示。

function Car(){
}

function Maruti(){
}

Maruti.prototype = new Car()
Maruti.prototype.constructor = Maruti

无法理解代码的最后一行。有人可以详细解释一下吗?

3 个答案:

答案 0 :(得分:0)

如果Maruti使用Car继承Maruti.prototype = new Car(),则需要使用Maruti重置类Maruti.prototype.constructor=Maruti;的构造函数属性,否则{{1}的实例会有Maruti的构造函数。

答案 1 :(得分:0)

在您设置Maruti.prototype = new Car之前,prototype Maruti只有一个属性constructor,其设置为Maruti本身:

function Car() {}

function Maruti(){}

console.log(Maruti.prototype); // logs the following
                               // {
                               //     constructor: Maruti
                               // }

Maruti.prototype = new Car;
Maruti.prototype.constructor = Maruti;

prototype的{​​{1}}设置为Maruti后,new Car属性将丢失(因为它不是同一个对象)。相反,constructor现在为Maruti.prototype.constructor(因为它继承自Car)。因此,我们再次将Car.prototype属性设置为constructor

要获得更直观的解释,请查看以下答案:https://stackoverflow.com/a/8096017/783743

答案 2 :(得分:0)

鉴于此,

function Car(){
}

并且constructor属性是函数原型的属性

现在,如果您查找新Car实例的构造函数

new Car().constructor === Car

您看到它是Car,然后您正在设置

function Maruti(){
}
Maruti.prototype = new Car();

请记住new Car().constructor === Car?,
现在,Maruti.prototype.constructor === Car,因此被遮蔽到Maruti实例,覆盖原始Maruti.prototype.constructor

因此,如果您创建Maruti的新实例并查找构造函数

new Maruti().constructor === Car

你看到它是Car, 虽然new Maruti()Maruti而不是Car

构建