Please help me to understand why the following code works:
<script>
var re = RegExp('\\ba\\b') ;
alert(re.test('a')) ;
alert(re.test('ab')) ;
</script>
In the first line there is no new
operator.
As far as I know, a contructor in JavaScript is a function that initialize objects created by the operator new
and they are not meant to return anything.
In general, if something is documented as being a constructor, use
new
with it. But in this case,RegExp
has a defined "factory" behavior for the situation where you've called it as a function instead. See Section 15.10.3 of the ECMAScript (JavaScript) specification (that links to the outgoing spec; the section number is the same in the new spec, which you can download from the ECMA front page [on the right-hand side]; I don't want to directly link to a ~4MB PDF file):You can actually define your own JavaScript constructor functions to allow omitting the
new
keyword (by detecting they've been called as a function instead, and turning around and calling themselves correctly), but I wouldn't suggest it as it leads to misleading code.+1 TJ Crowder has it. The ECMAScript standard goes out of its way to define behaviours for the built-in constructor functions when called as plain functions. Often it simply calls itself back as a constructor, but there are some more complicated cases.
In general, a constructor can ignore
this
and just return an independent object:in this case you can equally use the function as a constructor (with
new
) or a plain function.If the constructor doesn't return anything, as is the usual pattern for constructors, the
new
operator itself ensures that it returns the new object created and passed asthis
. In this case you must usenew
.It's best not to rely on a constructor working as a bare function, and the alternative behaviours of the built-in constructors are rarely of any use, so generally you should stick with
new
.