0

質問の誰かが、コンストラクター呼び出しで任意のオブジェクトを返すことが最近のバージョンの Javascript で導入された可能性があると彼が考えていると述べた、コンストラクター関数で手動で返す理由はありますか。

現在、別のブラウザにアクセスできず、これに関する情報も見つかりません。どのバージョンで導入されたのでしょうか、それともずっと存在していたのでしょうか?

長い間出回っていない場合、どのブラウザー バージョンがサポートされますか?

4

2 に答える 2

2

ECMA-262 ed 1 (ECMA サイトからオンラインでまだ入手可能) を見ると、次のように表示されます。

11.2.2 新しい演算子

プロダクションNewExpression : new NewExpressionは次のように評価されます。

  1. NewExpression を評価します。
  2. GetValue(Result(1)) を呼び出します。
  3. Type(Result(2)) が Object でない場合、実行時エラーを生成します。
  4. Result(2) が内部 [[Construct]] メソッドを実装していない場合、実行時エラーが発生します。
  5. Result(2) で [[Construct]] メソッドを呼び出し、引数を指定しません (つまり、引数の空のリスト)。
  6. Type(Result(5)) が Object でない場合、実行時エラーを生成します。
  7. 結果 (5) を返します。

そして、§15.3.2.1 #18 で[[Construct]]メソッドが説明されています (以下では、F は新しく構築された Function オブジェクトです)。

18.F の [[Construct]] プロパティを、呼び出されたときに [[Prototype]] プロパティが [[Construct]] メソッドの時点での F.prototype の値と等しい新しいオブジェクトを構築するメソッドに設定します。が呼び出され (ただし、この値がオブジェクトでない場合は Object.prototype の値が使用されます)、F を関数として ([[Call]] プロパティを使用して) 関数として呼び出し、新しいオブジェクトを this の値とし、引数を指定します。 [[Construct]] メソッドに引数として渡されます。[[Call]] メソッドを呼び出した結果がオブジェクトである場合、そのオブジェクトは [[Construct]] メソッドの呼び出しの結果になります。それ以外の場合、新しいオブジェクトは [[Construct]] メソッドの呼び出しの結果になります。

したがって、thisデフォルトで返されるコンストラクターは、最初から ECMAScript に含まれています。

于 2012-11-21T06:47:48.067 に答える
2

コンストラクター関数で手動で返す理由がいくつかあります。シングルトンはその 1 つにすぎません。

コンストラクターは、new演算子と共に使用することを意図した単なる関数です。このような方法で呼び出されるthisと、その関数のプロトタイプに基づいて作成されたオブジェクトにバインドされます。これthisは、 を使用してその関数を呼び出したときに返されるものでもあります(または を使用しない場合newはバインドされます)。windownew

これはプロセスを少し簡略化したものですが、全体像がよくわかるはずです。

そのようなコンストラクター関数から明示的に を返すと、Objectその関数のプロトタイプを使用して作成された元のオブジェクトが破棄され、明示的なオブジェクトが返されます (予想どおり)。

私の知る限り、それは常にこのようなものでした-または少なくとも関数が値を返すことが許可されている限り。:)

ここにリンクがあります:

ECMA-262 第 3 版から LS 風 (1999 年 - そうそう、ほぼ永遠に :)

于 2012-11-21T03:23:01.933 に答える