JavaScript:使用没有运算符'new'的构造函数

时间:2009-12-18 13:56:54

标签: javascript constructor new-operator object-construction

请帮助我理解以下代码的工作原理:

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

在第一行中没有new运算符。

据我所知,JavaScript中的一个构造函数是一个初始化运算符new创建的对象的函数,它们并不意味着返回任何内容。

2 个答案:

答案 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