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

Was ist der Unterschied? Wenn man sie in der Chromkonsole betrachtet, sehen sie identisch aus. Gleiche Eigenschaften am Objekt und die gleiche __proto__ Kette. Fast scheint wie Error wirkt wie eine Fabrik.throw Fehler ('msg') vs werfen neuen Fehler ('msg')

Welcher ist richtig und warum?

+5

Alle nativen Konstrukteuren in ECMAScript definiert sind, einschließlich ihrer jeweiligen Verhalten, wenn ohne 'new' aufgerufen wird. –

+2

Siehe auch [Wann ist 'new Error()' besser als 'Error()'?] (Http://stackoverflow.com/q/38759428/1048572) – Bergi

Antwort

82

Beide sind in Ordnung; dies wird ausdrücklich in the specification angegeben:

... So ist der Funktionsaufruf Error(…) an die Objekterstellung Ausdruck entspricht new Error(…) mit den gleichen Argumenten.

+0

Stimmt das auch in ES6? – paulmelnikow

11

Error wirkt wie eine Fabrik, in der Tat fast alle einheimischen Bauer tun: Array, Object, ... alle Check so etwas wie if (!(this instanceof Array)){ return new Array(arguments);}

Das heißt, im Falle eines Fehlers, ist es nicht einmal erforderlich ein Error Objekt zu werfen ... throw 'Bad things happened'; funktioniert auch
Sie sogar ein Objektliteral für das Debuggen werfen:

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

Ich fürchte, ich stimme nicht völlig zu. 'String (" abc ")' erzeugt kein 'String'-Objekt, während' new String ("abc") 'tut. – pimvdb

+1

@pimvdb: true, ich habe es in 'Object' geändert =>' Object ('foo') 'gibt ein String-Objekt zurück ... komm zu etwas davon _fast alle nativen Konstruktoren_ sind ein bisschen falsch ...' Nummer ',' Boolean', 'Date',' String' alle nicht ... 'Array',' Object' und 'Error' tun, aber' Event' und alle 'DOMxxxx'-api Konstruktoren werfen Fehler –

+0

ich auch Think 'new Array (arguments)' macht nicht genau was 'Array (1, 2, 3)' tut. Aber wahrscheinlich bin ich nur pingelig :) – pimvdb