35

次のコードが機能する理由を理解するのを手伝ってください。

<script>
    var re = RegExp('\\ba\\b') ;
    alert(re.test('a')) ;
    alert(re.test('ab')) ;
</script>

最初の行にはnew演算子がありません。

私の知る限り、JavaScriptのコンストラクターは、オペレーターによって作成されたオブジェクトを初期化する関数であり、new何も返すことを意図していません。

4

2 に答える 2

43

一般に、何かがコンストラクターとして文書化されている場合は、それとともに使用newします。ただし、この場合、RegExp代わりに関数として呼び出した状況に対して、定義された「ファクトリ」動作があります。ECMAScript(JavaScript)仕様のセクション15.10.3を参照してください(送信仕様にリンクしています。セクション番号は、ECMAフロントページ[右側]からダウンロードできる新しい仕様でも同じです。I 〜4MBのPDFファイルに直接リンクしたくない):

15.10.3関数として呼び出されるRegExpコンストラクタ
15.10.3.1RegExp(pattern、flags)
patternが[[Class]]プロパティが "RegExp"でフラグが定義されていないオブジェクトRである場合、Rを変更せずに返します。それ以外の場合は、RegExpコンストラクター(15.10.4.1)を呼び出し、それにパターンとフラグの引数を渡して、そのコンストラクターによって構築されたオブジェクトを返します。

実際には、独自のJavaScriptコンストラクター関数を定義して、キーワードを省略できるようにすることができますnew(代わりに関数として呼び出されたことを検出し、向きを変えて正しく呼び出すことにより)が、誤解を招くコードにつながるため、お勧めしません。(そして、構文ではそれを行うことはできません。class古い、より不格好なfunction構文を使用する必要があります。)

于 2009-12-18T14:11:22.503 に答える
13

+1TJクラウダーはそれを持っています。ECMAScript標準は、プレーン関数として呼び出された場合の組み込みコンストラクター関数の動作を定義するために邪魔になりません。多くの場合、それは単にコンストラクターとして自分自身を呼び戻しますが、より複雑な場合もあります。

javascript[...]のコンストラクターは何も返すことを意図していません

一般に、コンストラクター無視thisして、独立したオブジェクトを返すことができます。

function Thing() {
    return {'foo': 1};
}

この場合、関数をコンストラクター(with new)またはプレーン関数として同様に使用できます。

コンストラクターの通常のパターンのように、コンストラクターが何も返さない場合、newオペレーター自体が、作成されて渡された新しいオブジェクトを返すようにしますthis。この場合、を使用する必要がありますnew

ベア関数として機能するコンストラクターに依存しないことが最善であり、組み込みコンストラクターの代替動作が役に立たないことはめったにないため、通常はに固執する必要がありnewます。

于 2009-12-18T14:21:06.263 に答える