2012-05-11 61 views
23

以下JavaScript代碼對我來說非常混亂。任何人都可以幫助我理解。 PersonY爲什麼沒有原型屬性。功能與新功能的JavaScript區別

PersonX = function(){}; 
PersonY = new function(){}; 
alert(PersonX.prototype); 
alert(PersonY.prototype);  
​ 
+0

使用'function',而不是'new function'。 –

+0

只要做[永遠不要使用第二個構造](http://stackoverflow.com/q/10406552/1048572)。 – Bergi

回答

33
PersonX = function(){}; 

地方的引用匿名函數成PersonXPersonX指向一個函數。

PersonY = new function(){}; 

地方的引用一個匿名構造函數的一新構造的實例爲PersonYPersonY指向一個對象。


關於原型,PersonY有一個。但是,由於沒有附加到構造函數beforeafter實例的屬性和方法,所以它具有空白原型 *。

您可以通過執行console.log(PersonY)實際檢查PersonY的原型。你會看到它有一個原型屬性(我在Chrome中看到它爲__proto__),它是「空白」的。但它有2個隱藏屬性,constructor是構成函數的對象,另一個是__proto__,它引導您到下一個「鏈接」,它將成爲Object對象。

*因爲原型是一個鏈條,所以不是真正的空白。這個原型級別可能是空白的,但是更高級的原型可能具有,或者在這種情況下,具有屬性和方法。

Object prototype -> Constructor prototype -> Your Instance will have: 
- toString()  - blank     - toString() 
- hasOwnProperty()       - hasOwnProperty() 
- and more...        - and more... 
              - ...but nothing from Constructor 
+0

是的。 'typeof new function(){} =>「object」' –

+0

謝謝,@Joseph的回答和評論真的很有幫助。 – riship89

+0

哪個或哪兩個sintaxs性能更好? – rkmax

0

這是因爲它實際上是在內存中實例化功能的副本的對象;原型在創建實例的過程中確實只有意義,所以一旦創建它,​​就沒有合乎邏輯的構思。