を使用して関数を呼び出すとnew
、新しいオブジェクトが作成され、 として関数に渡されますthis
。関数が何も返さない (またはプリミティブを返す) 場合、渡された新しいオブジェクトはnew
式の結果です。ただし、関数がオブジェクトを返す場合、作成された新しいオブジェクトは破棄され、new
代わりに関数によって返されるオブジェクトが式の結果になります。これは、仕様のセクション 11.2.2の乱暴な散文でカバーされています。これは、コンストラクターが何らかのキャッシュを保持し、引数が同一 (またはもちろんシングルトン) の場合にインスタンスを再利用する不変オブジェクトに最も役立ちます。
したがって、あなたの例では、test
関数はオブジェクトを返すため、それを呼び出すnew
だけで、オペレーターによって作成されたオブジェクトが作成され、破棄されnew
、結果はtest
代わりに返されるオブジェクトになります。
new
別のオブジェクトを返す場合、からのオブジェクトが必ずしも「破棄される」とは言いません。コンストラクターは、オブジェクトが破棄されないようにするために、オブジェクトに対して何かを行う場合がありますnew
。たとえば、コンストラクタは次のように記述できます。
function WeirdConstructor() {
return {
theNewObject: this
};
}
...によって作成されたオブジェクトを受け取り、new
それが返すオブジェクトのプロパティにします。これを特別なシナリオと呼ぶのは控えめに言っても. :-)
Array(1, 2, 3)
とのnew Array(1, 2, 3)
両方が新しい配列を返すという事実は、実際にはArray
コンストラクターの特別な機能であり、セクション 15.4.1で説明されています。仕様では、標準コンストラクターを 経由で呼び出さない場合に、各標準コンストラクターが何をするかを慎重に説明していますnew
。動作はさまざまです。それらの多くは型強制を行います.2つは、使用していなくてもArray
使用したように動作し、本当に奇妙なことを行います(基本的に、現在の日付の文字列バージョンを提供します)。new
Date
String(new Date())
具体的Array
には : どちらも使用しませんArray(1, 2, 3)
または new Array(1, 2, 3)
. 私は使用します[1, 2, 3]
。あいまいではありません (new Array(3)
で空の配列を作成するlength = 3
か、その中に , という 1 つのエントリを含む配列を作成し3
ますかnew Array("3")
?)、誰かが記号Array
をシャドウできる可能性はありますが (可能性は低いですが)、リテラル形式をシャドウすることはできません。しかし、それがあなたの質問のポイントではなかったと思います。:-)