2012-06-01 223 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

相關問題