javascript - 将 JavaScript 构造函数作为函数调用是否存在问题(没有 new?)

标签 javascript

最近,我养成了调用 RegExp、String、Number、Object、TypeError 等而不使用“new”的习惯。

例如:

throw (TypeError("Error"));
var regex = RegExp('^word$');

我知道这对于需要“this”上下文的情况是不利的,因为没有“new”,“this”会对你的全局范围造成严重破坏,除非你将你的代码包装在'use strict'中,在这种情况下它会引发您试图改变“未定义”的错误。 (我不确定这是否适用于非常非常旧的浏览器)。

例如:

var constructor = function() {
    // 'use strict'; /* uncomment this line to avoid the behavior and be warned */
    this.state = 'working as intended';
};

var foo = constructor();
console.log(foo.state); // undefined
console.log(window.state); // we just polluted our global scope.

鉴于

var constructor = function() {
    this.state = 'working as intended';
};

var foo = new constructor;
console.log(foo.state); // "working as intended"
console.log(window.state); // we are clean.

但在上述情况下,这样做是否可以,或者如果我养成这样做的习惯,是否会给自己带来问题?

提前致谢。

最佳答案

请注意结果可能会有所不同。

例如,Number 构造函数创建 Number 对象,但当作为函数调用时,它仅对原始 Number 进行类型强制转换。

new Number(123); // Number { 123 }
Number(123); // 123

但是,是的,在很多情况下,您是否使用 new 并不重要。它们的存在是因为向后兼容,但最近引入的构造函数如 SetMap 确实需要 new

一般来说,当你想创建一个新对象时,我会推荐使用new。然后,

  • 如果只想进行类型转换,则必须调用 BooleanNumberString 而不调用 new .
  • 出于同样的原因,如果你想强制转换为 Object 类型,我不会使用 new,但没关系。
  • 如果你想创建一个没有文字语法的原语,你必须在没有new的情况下调用Symbol
  • 如果要创建原始值的对象包装器,则必须调用 BooleanNumberStringSymbol new
  • 如果你想实例化一个旧的构造函数,如ArrayObjectRegExpError等。 ,我会使用 new,但这没关系。
  • 如果你想实例化最近引入的构造函数,如 SetMapWeakSetWeakMap,键入数组等,你必须用new来调用它。

对于旧的构造函数来说没关系,如果你省略它,就像它们用 new 调用自己一样。例如,对于 RegExp ,

When RegExp is called as a function rather than as a constructor, it creates and initializes a new RegExp object. Thus the function call RegExp(…) is equivalent to the object creation expression new RegExp(…) with the same arguments.

关于javascript - 将 JavaScript 构造函数作为函数调用是否存在问题(没有 new?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39087575/

相关文章:

javascript - Cytoscape.js 无法在 for 循环中创建边

javascript - 删除在 React 和 Firebase 中不起作用

javascript - 如何让 luxon 在时区输出不带冒号的 ISO 日期格式

javascript - 我可以在react中删除props吗

javascript - react 响应轮播高度调整不当

php - 基于 PHP 和 jQuery 等开源的 Web 应用程序的含义

javascript - 未捕获的类型错误 : Cannot read property 'top' of undefined

javascript - 如何在滚动条上显示 React 组件

javascript - jquery 动画具有灵活的属性

javascript - Yarn Workspaces 和 Browserify - 子文件夹中的 package.json 破坏了构建