1. ホーム
  2. javascript

[解決済み] コンストラクタがこれを返さないようにするには、どのような値を返せばよいですか?

2023-04-06 17:25:20

質問

が使用できる具体的な状況はどのようなものですか? return 以外の値を返すことができます。 this を使用してコンストラクタを呼び出した場合 new キーワードで呼び出されたとき?

function Foo () {
  return something;
}

var foo = new Foo ();

もし私が間違っていなければ、もし something は非関数プリミティブで this が返されます。そうでなければ something が返されます。これは正しいのでしょうか?

言い換えると、どのような値で something を引き起こすために (new Foo () instanceof Foo) === false ?

どのように解決するのですか?

正確な条件は [[Construct]] の内部プロパティで使用されます。 new 演算子で使用されます。

ECMA-262 3rd.Editionの仕様より。Edition 仕様書より。

13.2.2 [[Construct]]

を指定すると [[Construct]] プロパティが Function オブジェクトの F が が呼び出されると、次のような手順となる。

  1. 新しいネイティブECMAScriptオブジェクトを作成します。
  2. を設定する。 [[Class]] のプロパティに Result(1)"Object" .
  3. のprototypeプロパティの値を取得します。 F .
  4. もし Result(3) がオブジェクトの場合は [[Prototype]] のプロパティに Result(1)Result(3) .
  5. もし Result(3) がオブジェクトでない場合は [[Prototype]] のプロパティに Result(1) を元の Object プロトタイプオブジェクトに に記述されている 15.2.3.1 .
  6. を呼び出す。 [[Call]] のプロパティを呼び出します。 F を提供します。 Result(1) として this の値として使用し に渡される引数リストを提供します。 [[Construct]] に渡される引数リストを に渡された引数リストを引数値として提供する。
  7. もし Type(Result(6))Object であれば Result(6) .
  8. 戻る Result(1) .

ステップ7と8を見ると、新しいオブジェクトが返されるのは の型が Result(6) (から返される値)。 F コンストラクタ 関数) は ではない であり、オブジェクトではありません。