3

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

function Car(){
}

function Maruti(){
}

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

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

4

3 回答 3

0

如果Maruti继承Carusing Maruti.prototype = new Car(),则需要重置类Marutiusing的构造函数属性Maruti.prototype.constructor=Maruti;,否则 的实例Maruti将具有 的构造函数Car

于 2013-07-18T06:40:46.957 回答
0

Maruti.prototype = new Car在设置prototypeof之前Maruti只有一个属性constructor,它被设置为Maruti自身:

function Car() {}

function Maruti(){}

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

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

设置后prototypeMaruti属性丢失(因为它不是同一个对象)new Carconstructor取而代之的Maruti.prototype.constructorCar(因为它继承自Car.prototype)。因此,我们再次将constructor属性设置为Maruti

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

于 2013-07-18T06:43:12.010 回答
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

于 2013-07-18T06:48:56.863 回答