我有两个班级Car
和Maruti
。当我通过将Maruti
的原型分配给新的Car
对象来使用继承时。为什么我必须将Maruti.prototype.constructor
设置为Maruti
。如下面的代码所示。
function Car(){
}
function Maruti(){
}
Maruti.prototype = new Car()
Maruti.prototype.constructor = Maruti
无法理解代码的最后一行。有人可以详细解释一下吗?
答案 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