[英]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
無關緊要。 它們存在是因為向后兼容,但最近引入的構造函數如Set
或Map
確實需要new
。
一般情況下,我建議您在創建新對象時使用new
。 然后,
new
情況下調用Boolean
, Number
或String
。 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
運算符的情況下使用本機構造函數的能力也不一致地應用於構造函數。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.