2013-07-18 24 views
4

我有两个类CarMaruti。当我使用继承时,将Maruti的原型分配给新的Car对象。为什么我必须将Maruti.prototype.constructor设置为Maruti。显示在下面的代码中。无法理解<x> .prototype.constructor?

function Car(){ 
} 

function Maruti(){ 
} 

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

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

+3

广告标题:你问我们不管你是无法理解 .prototype.constructor?可能是的,否则你不会问。 – TMS

+0

构造函数可以通过以下方式使用:'Person.prototype.haveChild = function(){return new this.constructor()}'这应该返回一个新的Person,但是如果你有Person从其他对象继承, Person.prototpe.constructor所以它指向错误的构造函数。你可能永远不会使用构造函数,很多示例代码都会忽略它(就像曾经发布过的'Maruti.prototype = Object.create(Car.prototype)'')但是如果你(或者某个扩展或使用你的代码的人)想要使用它晚些时候你需要修复它。 – HMR

+0

设置继承时最好不要调用“Parent”构造函数代码。在不调用构造函数的情况下设置原型[/ color] http://stackoverflow.com/questions/16063394/prototypical-inheritance-writing-up/16063711#16063711 – HMR

回答

1

如果Maruti继承Car使用Maruti.prototype = new Car(),你需要构造属性重置使用Maruti.prototype.constructor=Maruti;Maruti,否则Maruti情况下,将有Car构造。

0

之前你设定的MarutiMaruti.prototype = new Carprototype只有一个属性,constructor,它被设置为Maruti自己:你设置的Marutinew Carconstructor财产损失的prototype

function Car() {} 

function Maruti(){} 

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

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

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

为了更直观的解释来看看下面的回答:https://stackoverflow.com/a/8096017/783743

1

鉴于此,

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