2012-11-08 20 views
82
var err1 = Error('message'); 
var err2 = new Error('message'); 

Jaka jest różnica? Patrząc na nie w chromowanej konsoli, wyglądają identycznie. Te same właściwości na obiekcie i tym samym łańcuchu __proto__. Prawie wydaje się, że Error działa jak fabryka.throw error ('msg') vs throw new Error ('msg')

Który z nich jest prawidłowy i dlaczego?

+5

Wszystkie rodzime konstruktorzy są zdefiniowane w ECMAScript, w tym ich odpowiednie zachowanie po wywołaniu bez 'new'. –

+2

Zobacz także [Kiedy jest 'nowy błąd()' lepiej niż 'Błąd()'?] (Http://stackoverflow.com/q/38759428/1048572) – Bergi

Odpowiedz

82

Obie są w porządku; jest to wyraźnie określone w the specification:

... Zatem wywołanie funkcji Error(…) jest równoznaczne z wyrażeniem tworzenia obiektów new Error(…) z tymi samymi argumentami.

+0

Czy to samo dotyczy ES6? – paulmelnikow

11

Error ma działać jak w fabryce, w rzeczywistości prawie wszystkie rodzime konstruktorzy zrobić: Array, Object ... wszystko sprawdzić coś if (!(this instanceof Array)){ return new Array(arguments);}

Powiedział, że w przypadku wystąpienia błędu, to nawet nie jest wymagana rzucać obiektu Error ... throw 'Bad things happened'; zadziała też
można nawet rzucić przedmiot dosłownego do debugowania:

throw {message:"You've been a naughty boy", 
     context: this, 
     args: arguments, 
     more:'More custom info here'}; 
+3

Obawiam się, że nie w pełni się zgadzam. 'String (" abc ")' nie tworzy obiektu 'String', natomiast' new String ("abc") 'robi. – pimvdb

+1

@pimvdb: true, zmieniłem go na 'Object' =>' Object ('foo') 'zwraca obiekt typu string ... przyjdź do rzeczy _ prawie wszystkie rodzime konstruktory_ są trochę źle ...' Number ',' Boolean', 'Date',' String' wszystko nie ... 'Array',' Object' i 'Error' do, ale' Event' i wszyscy konstruktorzy 'DOMxxxx'-api zgłaszają błędy –

+0

Ja również myślę, że 'nowy Array (argumenty)' nie robi dokładnie tego, co robi 'Array (1, 2, 3)'. Ale prawdopodobnie jestem po prostu nitpicking :) – pimvdb

Powiązane problemy