JavaScript:použití konstruktoru bez operátoru „new“

Pomozte mi prosím pochopit, proč následující kód funguje:

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

V prvním řádku není new operátor.

Pokud vím, konstruktor v JavaScriptu je funkce, která inicializuje objekty vytvořené operátorem new a nejsou určeny k tomu, aby něco vracely.

Odpověď

Obecně platí, že pokud je něco zdokumentováno jako konstruktor, použijte new s tím. Ale v tomto případě RegExp má definované „tovární“ chování pro situaci, kdy jste jej místo toho nazvali jako funkci. Viz oddíl 15.10.3 specifikace ECMAScript (JavaScript) (který odkazuje na odchozí specifikaci; číslo oddílu je stejné v nové specifikaci, kterou si můžete stáhnout z titulní stránky ECMA [na pravé straně]; I nechci přímo odkazovat na ~4MB soubor PDF):

15.10.3 Konstruktor RegExp volaný jako funkce
15.10.3.1 RegExp(vzor, ​​příznaky)
Pokud je vzor objekt R, jehož vlastnost [[Class]] je „RegExp“ a příznaky nejsou definovány, vrátí R beze změny. Jinak zavolejte konstruktor RegExp (15.10.4.1), předejte mu argumenty pattern a flags a vraťte objekt vytvořený tímto konstruktorem.

Ve skutečnosti můžete definovat své vlastní funkce konstruktoru JavaScriptu, abyste umožnili vynechání new klíčové slovo (tím, že zjistí, že byly volány jako funkce, a otočili se a zavolali se správně), ale nenavrhoval bych to, protože to vede k zavádějícímu kódu. (A nemůžete to udělat s class syntaxi, musíte použít starší, neohrabanější function syntaxe.)