簡體   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