1

次のような 2 つの関数があるとします。

function a(){ this.x = 5; return {z:20};} 
function b(){ this.x = 5; return 30;} 

これらの行を実行すると、すべてが合理的に見えます。

a(); //output : {z:20} 
b(); //output : 30; 

しかし、それらをオブジェクト コンストラクターとして実行すると、次のようになります。

new a() //output : Object {z:20} 
new b() //output : b {x:5} 

newコンストラクターが常にオブジェクトを返す必要があるかどうかわかりません。動作が異なるのはなぜですか? JavaScript は戻り値の型を監視しますか? 戻り値の型がオブジェクトの場合はそれを直接返し、そうでない場合は開始されたインスタンスを返しますか?

コンストラクターだと思うので、戻り値の型を常に無視して、開始されたオブジェクトを返す必要があります。この動作が JavaScript を複雑にしすぎていると思います。ここに私が得られない何かがありますか?

4

1 に答える 1

2

新しいコンストラクターが常にオブジェクトを返す必要があるかどうかわかりません。動作が異なるのはなぜですか? JavaScript は戻り値の型を監視しますか? 戻り値の型がオブジェクトの場合はそれを直接返し、そうでない場合は開始されたインスタンスを返しますか?

基本的にはい。関数の戻り値がオブジェクトでない場合、newオペレーターはthis代わりに (新しいオブジェクト) を返します (実際には、それを行うのは内部[[Construct]]メソッドです)。

コンストラクターだと思うので、戻り値の型を常に無視して、開始されたオブジェクトを返す必要があります。この動作が JavaScript を複雑にしすぎていると思います。ここに私が得られない何かがありますか?

それは本当に主観的な意見です。利点は、コンストラクターが別の値を返すことを決定できることです。これにより、より柔軟になります。反対に、値を返さない方がその逆よりも一般的であると私は主張します。

于 2014-03-05T23:31:23.240 に答える