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

Get*_*ree 27 javascript constructor new-operator object-construction

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

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

在第一行没有new运营商.

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

T.J*_*der 36

通常,如果某些内容被记录为构造函数,请使用new它.但在这种情况下,RegExp对于您将其称为函数的情况,具有已定义的"工厂"行为.请参阅ECMAScript(JavaScript)规范的第15.10.3节(链接到传出规范;新规范中的节号相同,您可以从ECMA 首页 [右侧]下载; I不想直接链接到~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关键字(通过检测它们被称为函数而转向并正确调用自己),但我不建议它,因为它会导致误导性代码.

  • @TJCrowder`通过检测它们被称为函数而不是转身并正确地调用自己.你是怎么做到的? (2认同)

bob*_*nce 10

+1 TJ Crowder拥有它.当调用普通函数时,ECMAScript标准不再为内置构造函数定义行为.通常它只是将自己称为构造函数,但是有一些更复杂的情况.

javascript [...]中的构造函数并不意味着返回任何内容

通常,构造函数可以忽略this并返回一个独立的对象:

function Thing() {
    return {'foo': 1};
}
Run Code Online (Sandbox Code Playgroud)

在这种情况下,您可以同样使用该函数作为构造函数(with new)或普通函数.

如果构造函数没有返回任何内容,就像构造函数的常用模式一样,new运算符本身也会确保它返回创建并传递的新对象this.在这种情况下,你必须使用new.

最好不要依赖于作为裸函数的构造函数,并且内置构造函数的替代行为很少有任何用处,所以通常你应该坚持使用new.

  • +1.只是在这里添加"Bob"和"Teej",如果返回的值是数字,字符串或布尔值,则忽略显式的`return somethingOtherThan_this`.在这种情况下,隐式的`return this`会默默地覆盖你自己的return语句. (2认同)