2013-03-29 68 views
4

嘗試理解原型。我在Chrome的控制檯中玩耍,並希望有人能指出我爲什麼會發生這種情況。用javascript中的對象覆蓋原型的問題

function Gadget(name, color) { 
    this.name = name; 
    this.color = color; 
    this.whatAreYou = function(){ 
     return 'I am a ' + this.color + ' ' + this.name; 
    } 
} 

Gadget.prototype.price = 100; 
Gadget.prototype.rating = 3; 
Gadget.prototype.getInfo = function() { 
    return 'Rating: ' + this.rating + ', price: ' + this.price; 
}; 

var newtoy = new Gadget('webcam', 'black'); 

newtoy.constructor.prototype 

Gadget {price: 100, rating: 3, getInfo: function} //Expected 

現在,如果我嘗試以下,原型並沒有預期的結果。

function Gadget(name, color) { 
    this.name = name; 
    this.color = color; 
    this.whatAreYou = function(){ 
     return 'I am a ' + this.color + ' ' + this.name; 
    } 
} 

Gadget.prototype = { 
    price: 100, 
    rating: 3, 
    getInfo: function() { 
     return 'Rating: ' + this.rating + ', price: ' + this.price; 
    } 
}; 

var newtoy = new Gadget('webcam', 'black'); 

newtoy.constructor.prototype 

Object {} //Empty Object!!!!!??? 
+0

你在找'newtoy .__ proto__'嗎?即你在尋找什麼'newtoy.constructor'? –

+0

http://stackoverflow.com/a/8096017/783743 –

回答

4

jsFiddle Demo

這是因爲你改寫,而不是當你這樣做擴展它的原型:

Gadget.prototype = 

它覆蓋它的時候,做出的一個門面是常見構造函數是這樣的:

Gadget.prototype = { 
constructor : Gadget 
} 

因此,對於您的確切情況:

Gadget.prototype = { 
constructor : Gadget, 
price: 100, 
rating: 3, 
getInfo: function() { 
    return 'Rating: ' + this.rating + ', price: ' + this.price; 
} 
}; 
+0

這就是問題所在,但如果你解釋瞭如何正確地做到這一點會更有幫助。如果你願意的話,我會加倍努力 – Markasoftware

+0

@Markasoftware - 查看編輯 –

+1

啊......這實際上是有道理的。我正在閱讀Stoyan Stefanov編寫的面向對象的Javascript,他這樣做,但沒有明確提及這種影響,或者我沒有意識到。 – KingKongFrog

1

原型最初是一種特殊類型的對象。當你用一個新對象賦值原型時(花括號是一個新對象的簡寫),你會失去特殊的原型對象。

請參閱How does JavaScript .prototype work?瞭解更多詳情。