JavaScript:使用不带运算符的构造函数 'new'

标签 javascript constructor new-operator object-construction

请帮助我理解为什么以下代码有效:

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

第一行没有 new 运算符。

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

最佳答案

一般来说,如果某个东西被记录为构造函数,请对其使用 new 。但在本例中,RegExp 对于您将其作为函数调用的情况具有定义的“工厂”行为。请参阅 ECMAScript (JavaScript) specification 第 15.10.3 节(链接到即将发布的规范;新规范中的部分编号相同,您可以从 ECMA front page [右侧] 下载;我不想直接链接到 ~4MB PDF 文件):

15.10.3 The RegExp Constructor Called as a Function
15.10.3.1 RegExp(pattern, flags)
If pattern is an object R whose [[Class]] property is "RegExp" and flags is undefined, then return R unchanged. Otherwise call the RegExp constructor (15.10.4.1), passing it the pattern and flags arguments and return the object constructed by that constructor.

您实际上可以定义自己的 JavaScript 构造函数,以允许省略 new 关键字(通过检测它们已被作为函数调用,然后转身并正确调用自身),但我不会不建议这样做,因为它会导致误导性代码。 (而且你不能使用 class 语法来做到这一点,你必须使用旧的、更笨重的 function 语法。)

关于JavaScript:使用不带运算符的构造函数 'new',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1928342/

相关文章:

java - 构造函数中的多态方法 (Java)

c++ - 什么时候重载 operator new?

java - 字符串是 Java 中的对象,那我们为什么不使用 'new' 来创建它们呢?

c++ - 我如何禁止在 C++ 代码的某些部分使用 "new"?

Javascript 返回值而不打破循环

javascript - 将数组展开为没有父 ID 但有级别的树

C++ 创建多个构造函数

javascript - Google Apps 脚本,从外部电子表格检索数据的最快方法

javascript - 使用 React Native 和 Redux 的动画状态管理

c++ - struct 中的默认值和构造函数顺序