2013-04-03 40 views
0

我正在研究Javascript對象和原型,據我所知,定義構造函數的兩種方式最終都有類似的結果。不同原型的Javascript對象構造器混淆

例如,在此代碼完全相同的構造函數有兩種不同的方式定義但他們最終有不同的原型值:

var PersonOne = function() {}; 

function PersonTwo(){}; 

var p1 = new PersonOne(); 
var p2 = new PersonTwo(); 

console.log(p1.constructor.prototype); 
console.log(p2.constructor.prototype); 

結果:

Object {} 
PersonTwo {} 

顯然我錯了並在PersonOne中定義構造函數的結果是構造函數的原型是Object。那會影響繼承。但問題是,這種不同結果的原因是什麼?

我認爲這個問題可能是由於PersonOne函數在運行時被定義,而PersonTwo在分析時被定義的事實?謝謝您的幫助。

回答

3

區別在於PersonOne已被賦予匿名函數表達式的結果。指定的變量只是該函數的別名,但構造函數本身沒有.name屬性。

相反,如果你已經宣佈它:

var PersonOne = function MyPersonOne() {}; 

那麼作爲new PersonOne創建的對象的原型是MyPersonOne

這很重要 - 它確保您無法通過創建構造函數的別名來創建任意「類型」的對象。對象的「類型」必須與構造函數的(真實)名稱相同。

+0

優秀點,謝謝澄清現在我得到它:) –