请帮助我理解以下代码的工作原理:
<script>
var re = RegExp('\\ba\\b') ;
alert(re.test('a')) ;
alert(re.test('ab')) ;
</script>
在第一行中没有new
运算符。
据我所知,JavaScript中的一个构造函数是一个初始化运算符new
创建的对象的函数,它们并不意味着返回任何内容。
答案 0 :(得分:36)
通常,如果某些内容被记录为构造函数,请使用new
。但在这种情况下,RegExp
对于您将其称为函数的情况具有已定义的“工厂”行为。请参阅ECMAScript(JavaScript){15}的第15.10.3节(链接到传出规范;新规范中的节号相同,您可以从ECMA specification下载[在右侧];我不想直接链接到~4MB PDF文件):
15.10.3 RegExp构造函数称为函数
15.10.3.1 RegExp(模式,标志)
如果pattern是一个对象R,其[[Class]]属性为“RegExp”且flags未定义,则返回R不变。否则调用RegExp构造函数(15.10.4.1),传递模式和flags参数并返回该构造函数构造的对象。
你可以实际定义你自己的JavaScript构造函数,以便省略new
关键字(通过检测它们被称为函数而转向并自行调用),但我不建议因为它会导致误导性的代码。
答案 1 :(得分:10)
+1 TJ Crowder拥有它。当调用普通函数时,ECMAScript标准不再为内置构造函数定义行为。通常它只是将自己称为构造函数,但是有一些更复杂的情况。
javascript [...]中的构造函数并不意味着返回任何内容
通常,构造函数可以忽略this
并返回一个独立的对象:
function Thing() {
return {'foo': 1};
}
在这种情况下,您可以同样使用该函数作为构造函数(使用new
)或普通函数。
如果构造函数没有返回任何内容,就像构造函数的常用模式一样,new
运算符本身确保它返回创建并作为this
传递的新对象。在这种情况下,您必须使用new
。
最好不要依赖于作为裸函数的构造函数,并且内置构造函数的替代行为很少有用,所以通常你应该坚持使用new
。