繁体   English   中英

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

[英]Are there problems with calling JavaScript constructors as functions(without new?)

最近,我习惯于在没有“new”的情况下调用RegExp,String,Number,Object,TypeError等。

例如:

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

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

例如:

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对象,但是当作为函数调用时,它只会将coercion类型设置为原始Number。

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

但是,有很多情况下,无论你是否使用new无关紧要。 它们存在是因为向后兼容,但最近引入的构造函数如SetMap确实需要new

一般情况下,我建议您在创建新对象时使用new 然后,

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

对于那些无关紧要的旧构造函数,如果省略它就像是用new表示自己。 例如,对于RegExp

RegExp作为函数而不是构造函数调用时,它会创建并初始化一个新的RegExp对象。 因此,函数调用RegExp(…)等效于具有相同参数的对象创建表达式new RegExp(…)

另一个答案所述 ,一些内置构造函数被编写为能够被称为函数。 因此,只要您没有污染全局命名空间,我相信您应该对您列出的示例感到满意。

话虽如此,在大多数情况下,我不会习惯这种习惯; new运算符增加了代码清晰度,这比简洁更重要。 在没有new运算符的情况下使用本机构造函数的能力也不一致地应用于构造函数。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM