最近,我习惯于在没有“new”的情况下调用RegExp,String,Number,Object,TypeError等等。
e.g:
throw (TypeError("Error"));
var regex = RegExp('^word$');
我知道这对于需要“this”上下文的情况是不好的,因为没有“new”,“this”会对你的全局范围造成严重破坏,除非你将代码包装在'use strict'中,在这种情况下它会引发您试图改变'undefined'的错误。 (我不确定这在非常老的浏览器中是否有效。)
e.g:
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.
但是在上述情况下,这样做是否可以,或者如果我习惯这样做,我是否会遇到问题?
提前致谢。
答案 0 :(得分:8)
请注意结果可能不同。
例如,Number
构造函数创建了Number对象,但是当作为函数调用时,它只会对基本数字类型进行强制类型。
new Number(123); // Number { 123 }
Number(123); // 123
但是,是的,有很多情况下你是否使用new
并不重要。它们存在是因为向后兼容,但最近引入的构造函数如Set
或Map
确实需要new
。
一般情况下,我建议您在创建新对象时使用new
。然后,
Boolean
的情况下致电Number
,String
或new
。new
,但这没关系。Symbol
之后调用new
。Boolean
调用Number
,String
,Symbol
或new
。< / LI>
Array
,Object
,RegExp
,Error
等旧构造函数,我会使用new
,但它没关系。Set
,Map
,WeakSet
,WeakMap
,类型化数组等,则必须使用{{ 1}}。对于没有关系的旧构造函数,如果省略它,就像用new
调用自己一样。例如,对于RegExp
,
当
new
作为函数而不是构造函数调用时,它 创建并初始化一个新的RegExp对象。因此函数调用RegExp
等同于对象创建表达式RegExp(…)
具有相同的参数。
答案 1 :(得分:3)
如another answer中所述,一些内置的构造函数被编写为能够被称为函数。所以只要你没有污染你的全局命名空间,我相信你应该对你列出的例子没问题。
话虽如此,在大多数情况下,我不会习惯这种习惯; new
运算符增加了代码清晰度,这比简洁更重要。在没有new
运算符的情况下使用本机构造函数的能力也不一致地应用于构造函数。