2012-06-01 61 views
0

问题:为什么p1的构造函数出现为Person.Shouldn't它是人吗?什么应该是构造函数属性值..a原型构造函数或对象构造函数本身

function Person() 
{ 
this.type='person' 
} 
function Man() 
{ 
this.type='Man' 
} 

Man.prototype=new Person(); 

var p1=new Man(); 
console.log('p1\'s constructor is:'+p1.constructor); 
console.log('p1 is instance of Man:'+(p1 instanceof Man)); 
console.log('p1 is instance of Person:'+(p1 instanceof Person)); 

http://jsfiddle.net/GSXVX/

回答

0

时改写原prototype对象时,破坏了原有的.constructor财产......

Man.prototype = new Person(); 

您可以手动替换它,但除非你做这将是一个枚举属性在不可枚举的(在ES5实现中)。

Man.prototype=new Person(); 
Man.prototype.constructor = Man; // This will be enumerable. 

// ES5 lets you make it non-enumerable 
Man.prototype=new Person(); 
Object.defineProperty(Man.prototype, 'constructor', { 
    value: Man, 
    enumerable: false, 
    configurable: true, 
    writable: true 
}); 
+0

嗯,你说原来的原型对象(ieMan.prototype)的原型链中被覆盖。但我们从bottom.So对象的(P1的)constructor属性,应首先检查开始这不会被覆盖。为什么我们甚至会去检查原型的构造器属性(如果它存在于对象本身中的话)? – hariom

+0

@kaioken:'p1'对象没有自己的'.constructor'属性。或者至少你的问题中的代码不分配一个。它从原型链获得其'.constructor'属性。由于您为'Man'覆盖了原始原型对象,并且没有手动重新分配'.constructor'属性,因此它会继续沿着链向新的Man.prototype对象的原型对象,即Person.prototype ',它仍然有它的原始'.constructor'属性。如果那个被删除,它会继续下去,直到找到一个*(或没有)*。 – 2012-06-01 14:06:21