2016-08-22 12 views
12

Niedawno miałem nawyk wywoływania takich rzeczy jak RegExp, String, Number, Object, TypeError, itp. Bez "nowego".Czy występują problemy z wywoływaniem konstruktorów JavaScript jako funkcji (bez nowych?)

np

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

wiem, że to jest złe dla przypadków, gdy potrzebne jest „ten” kontekst, ponieważ bez „nowy”, „ta” sieje spustoszenie w zakresie globalnym chyba owinąć kod w "użyj ścisłego", w którym to przypadku pojawia się błąd, że próbujesz mutować "niezdefiniowany". (Nie jestem pewien, czy działa to w bardzo starych przeglądarkach).

np

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. 

natomiast

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. 

Ale w przypadkach takich jak te powyżej, to jest w porządku, aby to zrobić, czy istnieją problemy mam ustawienie się do góry na razie mam się dostać do nawyk robienia tego?

Dziękuję z wyprzedzeniem.

Odpowiedz

8

Należy pamiętać, że wynik może się różnić.

Na przykład konstruktor Number tworzy obiekty liczbowe, ale po wywołaniu jako funkcję wprowadza tylko wymuszenie na liczbę pierwotną.

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

Ale tak, istnieje wiele przypadków, w których nie ma znaczenia, czy używasz new czy nie. Istnieją one ze względu na kompatybilność wsteczną, ale z niedawno wprowadzonymi konstruktorami takimi jak Set lub Map wymagają new.

Ogólnie, polecam używanie new, gdy chcesz utworzyć nowy obiekt. Następnie

  • Jeśli chcesz tylko zrobić rodzaj przymusu, należy zadzwonić Boolean, Number lub String bez new.
  • Z tego samego powodu, jeśli chcesz przymusić do typu obiektu, nie użyłbym new, ale to nie ma znaczenia.
  • Jeśli chcesz utworzyć prymitywę, która nie ma składni literalnej, musisz zadzwonić pod numer Symbol bez numeru new.
  • Aby utworzyć obwolutę obiektu o wartości pierwotnej, należy wywołać Boolean, Number, String lub Symbol z new.
  • Jeśli chcesz utworzyć instancję starego konstruktora, takiego jak Array, Object, RegExp, Error itd., Użyłbym new, ale to nie ma znaczenia.
  • Jeśli chcesz utworzyć wystąpienie ostatnio wprowadzonego konstruktora, takiego jak Set, Map, WeakSet, WeakMap, tablice maszynowe itp., Musisz zadzwonić pod numer new.

Dla starych konstruktorów, że nie ma to znaczenia, to tak, jak się nazywają z new, jeśli go pominiecie. Na przykład, dla RegExp,

Kiedy RegExp nazywany jest jako funkcja raczej niż jako konstruktor, to tworzy i inicjuje nowy obiekt RegExp. Tak więc wywołanie funkcji RegExp(…) jest równoważne z wyrażeniem tworzenia obiektu o tych samych argumentach.

+0

Więc mówisz o takich rzeczach jak RegExp i TypeError i String (w kontekście konkatenacji), to jest idealnie w porządku? – Dmitry

+0

@Dmitry To jest w porządku dla [Konstruktora RegExp] (http://www.ecma-international.org/ecma-262/6.0/#sec-regexp-constructor) i [Konstruktora błędu] (http: // www. ecma-international.org/ecma-262/6.0/#sec-error-constructor). Nie dla String, Boolean, Number. – Oriol

+0

, więc robiąc rzeczy takie jak 'console.log (String (1392))' zamiast 'console.log (1392.toString())' lub 'console.log ('' + 1392)' lub po prostu 'console.log (1392) 'nie jest w porządku? – Dmitry

3

Zgodnie z dokumentacją w another answer, niektóre wbudowane konstruktory są napisane tak, aby można je było wywoływać jako funkcje. Dopóki nie zanieczyszczasz globalnej przestrzeni nazw, uważam, że powinieneś mieć się dobrze z podanym przykładem.

W większości przypadków nie przyzwyczaiłbym się do tego nawyku; Operator new zwiększa przejrzystość kodu, co jest ważniejsze niż zwięzłość. Możliwość korzystania z rodzimych konstruktorów bez operatora new jest również niespójnie stosowana w odniesieniu do konstruktorów.

Powiązane problemy