最近,我养成了调用 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
并不重要。它们的存在是因为向后兼容,但最近引入的构造函数如 Set
或 Map
确实需要 new
。
一般来说,当你想创建一个新对象时,我会推荐使用new
。然后,
- 如果只想进行类型转换,则必须调用
Boolean
、Number
或String
而不调用new
. - 出于同样的原因,如果你想强制转换为 Object 类型,我不会使用
new
,但没关系。 - 如果你想创建一个没有文字语法的原语,你必须在没有
new
的情况下调用Symbol
。 - 如果要创建原始值的对象包装器,则必须调用
Boolean
、Number
、String
或Symbol
与new
。 - 如果你想实例化一个旧的构造函数,如
Array
、Object
、RegExp
、Error
等。 ,我会使用new
,但这没关系。 - 如果你想实例化最近引入的构造函数,如
Set
、Map
、WeakSet
、WeakMap
,键入数组等,你必须用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 callRegExp(…)
is equivalent to the object creation expressionnew RegExp(…)
with the same arguments.
关于javascript - 将 JavaScript 构造函数作为函数调用是否存在问题(没有 new?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39087575/