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.)