次のコードが機能する理由を理解するのを手伝ってください。
<script>
var re = RegExp('\\ba\\b') ;
alert(re.test('a')) ;
alert(re.test('ab')) ;
</script>
最初の行にはnew
演算子がありません。
私の知る限り、JavaScriptのコンストラクターは、オペレーターによって作成されたオブジェクトを初期化する関数であり、new
何も返すことを意図していません。
次のコードが機能する理由を理解するのを手伝ってください。
<script>
var re = RegExp('\\ba\\b') ;
alert(re.test('a')) ;
alert(re.test('ab')) ;
</script>
最初の行にはnew
演算子がありません。
私の知る限り、JavaScriptのコンストラクターは、オペレーターによって作成されたオブジェクトを初期化する関数であり、new
何も返すことを意図していません。
一般に、何かがコンストラクターとして文書化されている場合は、それとともに使用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
構文を使用する必要があります。)
+1TJクラウダーはそれを持っています。ECMAScript標準は、プレーン関数として呼び出された場合の組み込みコンストラクター関数の動作を定義するために邪魔になりません。多くの場合、それは単にコンストラクターとして自分自身を呼び戻しますが、より複雑な場合もあります。
javascript[...]のコンストラクターは何も返すことを意図していません
一般に、コンストラクターは無視this
して、独立したオブジェクトを返すことができます。
function Thing() {
return {'foo': 1};
}
この場合、関数をコンストラクター(with new
)またはプレーン関数として同様に使用できます。
コンストラクターの通常のパターンのように、コンストラクターが何も返さない場合、new
オペレーター自体が、作成されて渡された新しいオブジェクトを返すようにしますthis
。この場合、を使用する必要がありますnew
。
ベア関数として機能するコンストラクターに依存しないことが最善であり、組み込みコンストラクターの代替動作が役に立たないことはめったにないため、通常はに固執する必要がありnew
ます。