おそらく多くの人はこれに同意しないでしょう。関数の前に new キーワードを追加するということは、オブジェクトをインスタンス化することを意味します。しかし、物事は明らかにそれほど単純ではありません:
function Test() {
this.name = 'Test';
return function() { return true }
}
var test = new Test();テストとは何ですか?
Testオブジェクトですか?間違っている!ここで、test は関数 - function() { return true } で返されます。このとき、 new Test() は Test() と等価です。 new Test() == Test() を使用して両者が等しいかどうかを判定すると false が返されます。 , Javascript For Object Comparison with Functionは参照に基づいているためです。
var fnT = Test();
var newT = new Test();
fnT は文字列 Test であることは明らかですが、newT はどうでしょうか。はは、最初の例を見て混乱しましたか?実際、現時点では newT は Test オブジェクトです。これには、値が文字列 Test である name という名前のプロパティがあります。
上記の 2 つのコードを通じて、関数の戻り値が従来の意味での値型 (Number、String、Boolean) である場合、新しい関数は関数のインスタンス オブジェクトを返すと推測できます。 if 関数 参照型 (Object、Array、Function) が返された場合、新しい関数は関数を直接呼び出した場合と同じ結果を生成します。これは、Test 関数でさまざまなタイプの値を返すテストによって確認できます。
この点を区別することは実際には非常に重要であり、少なくともオブジェクト指向フレームワークのクラス ライブラリ コードを見るときに混乱が少なくなります。