2012-05-11 14 views
23

次のJavaScriptコードはとてもわかりやすいものです。誰でも私の理解を助けることができますか? PersonYはプロトタイププロパティを持たないのはなぜですか?関数と新しい関数のJavaScriptの相違点

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

'function'ではなく' function'を使います。 –

+0

ちょうど[決して2番目の構造を使用する](http://stackoverflow.com/q/10406552/1048572)。 – Bergi

答えて

33
PersonX = function(){}; 

PersonXに匿名関数への参照を配置します。 PersonXは関数を指します。

PersonY = new function(){}; 

PersonYに匿名コンストラクタ関数の新たに構築されたインスタンスへの参照を配置します。 PersonYはオブジェクトを指します。


プロトタイプに関しては、PersonYに1があります。ただし、コンストラクタbeforeまたはafterインスタンスにアタッチされたプロパティおよびメソッドがないため、ブランクプロトタイプ *があります。

console.log(PersonY)を実行すると、実際にPersonYのプロトタイプを確認できます。プロトタイププロパティがあることがわかります(Chromeで__proto__と表示されています)。これは「空白」です。しかし、それはオブジェクトを作成するコンストラクタ関数であるconstructorの2つの隠れたプロパティと、Objectオブジェクトである次の "チェーンリンク"につながるもう一つの__proto__を持っています。

※プロトタイプはチェーンなので空白ではありません。このプロトタイプレベルは空白かもしれませんが、次の上位のプロトタイプがこの場合にはプロパティとメソッドを持つ場合があります。それは実際には関数のコピーとしてメモリ内にインスタンス化されたオブジェクトであるためです

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

ありがとう、@ジョセフの回答とコメントは本当に役に立ちました。 – riship89

+0

2つのsintaxがパフォーマンスに優れていますか? – rkmax

0

。プロトタイプは実際にインスタンスの作成のコンテキストで意味を持つだけなので、作成されるとその意味の論理的な構成はありません。

関連する問題