コンストラクター関数で this 以外の戻り値が返される奇妙なケース
new キーワードを使用してコンストラクター関数を呼び出すと、通常、関数は新しく作成された値を返すと想定されます。物体。ただし、特定の状況下では、代わりに this 以外の値が返されることがあります。
JavaScript では、この動作を制御する正確な条件は、関数オブジェクトの ECMAScript 仕様の内部 [[Construct]] プロパティで定義されます。呼び出されると、このプロパティは次の手順を実行します。
- 新しいオブジェクトを作成します。
- その [[Class]] プロパティを「Object」として設定します。
- 取得コンストラクター関数からのプロトタイプ プロパティの値。
4-5.新しいオブジェクトの [[Prototype]] プロパティをプロトタイプ値 (オブジェクトの場合)、それ以外の場合は元の Object プロトタイプ オブジェクトに設定します。
- 次を使用して、コンストラクター関数の [[Call]] プロパティを呼び出します。新しいオブジェクトを次のように作成し、コンストラクターの引数を引数として渡します。
7-8. 重要なステップ: Type(Result(6)) がオブジェクトでない場合は新しいオブジェクトを返し、それ以外の場合は Result(1) (ステップ 1 で作成された新しいオブジェクト) を返します。
したがって、コンストラクター関数によって返される値によって、新しく作成されたオブジェクトが返されるかどうかが決まります。
- 返された値が 非オブジェクト プリミティブ の場合、新しいオブジェクトが返されます。
- 戻り値が 任意のオブジェクト の場合、代わりにこれが返されます。
新しく作成されたオブジェクトかどうかをテストするにはコンストラクターによって返されたものと実際に異なる場合は、 (new Foo()instanceof Foo) === false.
を確認できます。
以上がコンストラクター関数が this 以外の値を返す場合があるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。