将JavaScript构造函数作为函数调用(没有新的?)是否存在问题
Are there problems with calling JavaScript constructors as functions(without new?)
最近,我养成了调用RegExp、String、Number、Object、TypeError等不带"new"的习惯。
例如:
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对象,但当作为函数调用时,它只对基元Number进行类型强制。
new Number(123); // Number { 123 }
Number(123); // 123
但是的,在很多情况下,是否使用new
并不重要。它们的存在是因为向后兼容性,但最近引入的构造函数(如Set
或Map
(确实需要new
。
通常,当您想要创建一个新对象时,我建议您使用new
。然后,
- 如果只想执行类型强制,则必须调用不带
new
的Boolean
、Number
或String
- 出于同样的原因,如果您想强制为Object类型,我不会使用
new
,但这并不重要 - 如果要创建一个没有文字语法的基元,则必须调用不带
new
的Symbol
- 如果要创建基元值的对象包装器,则必须使用
new
调用Boolean
、Number
、String
或Symbol
- 如果您想实例化一个旧的构造函数,如
Array
、Object
、RegExp
、Error
等,我会使用new
,但这无关紧要 - 如果要实例化最近引入的构造函数,如
Set
、Map
、WeakSet
、WeakMap
、类型化数组等,则必须使用new
调用它
对于那些无关紧要的老构造函数,如果省略它,它们就好像用new
来调用自己一样。例如,对于RegExp
,
当
RegExp
作为函数而不是构造函数调用时创建并初始化一个新的RegExp对象。因此函数调用RegExp(…)
等效于对象创建表达式具有相同自变量的new RegExp(…)
。
如另一个答案所述,一些内置构造函数被编写为能够作为函数调用。所以,只要你没有污染你的全局命名空间,我相信你应该对你列出的例子很满意。
话虽如此,在大多数情况下,我不会习惯这种习惯;new
运算符增加了比简洁更重要的代码清晰度。在没有new
运算符的情况下使用本机构造函数的能力在构造函数之间的应用也不一致。
- 作用域问题-此函数是否形成闭包-JavaScript
- 递归Javascript对象是否会导致任何问题(内存泄漏)
- 是否有其他人在设计Twitter Typeahead时遇到问题'的搜索栏
- JS代码有什么问题,让我知道代码是否可以改进
- 是否从超时内开始间隔是一个问题
- 对jQuery使用setTimeout()是否有任何问题;媒体查询“;类型情况
- 是否可以在 JavaScript 中实现没有舍入问题的任意精度算术
- XMLhttpRequest 的问题,不确定调用是否正确
- 是否存在替换Javascript构造函数的问题'原型,而不是添加到原型中
- 来自 NodeJS 脚本的注释是否有可能产生内存问题
- 在 Web 音频 API 中使用多个音频上下文是否存在相关问题
- 使用“需要导入粉尘.js”是否存在任何已知问题
- 如何在纯 javascript 中检查元素是否有 ID?和条件语句问题
- 在javascript中操纵信用卡号是否会导致安全问题
- 如果我将一个元素从一个容器移动到另一个容器,是否存在范围问题
- 是否有修复“滚动到”jquery 函数在火狐中不起作用的问题
- 对函数表达式和我分配函数表达式的变量使用相同的标识符是否存在任何问题
- addEventListener 给出 IE8 问题.是否可以将我的JavaScript转换为jQuery
- 使用带有选择框的 jQuery 的 insertAfter() 是否存在已知的性能问题
- 检查数组是否包含数字(问题为 0)