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

Qual è la differenza? Guardandoli nella console cromata, sembrano identici. Stesse proprietà sull'oggetto e sulla stessa catena __proto__. Sembra quasi che Error si comporti come una fabbrica.throw error ('msg') vs throw new Error ('msg')

Quale è corretto e perché?

+5

tutti i costruttori nativi sono definite in ECMAScript, compresi i rispettivi comportamento quando invocato senza 'new'. –

+2

Vedere anche [Quando è 'nuovo Errore()' migliore di 'Errore()'?] (Http://stackoverflow.com/q/38759428/1048572) – Bergi

risposta

82

Entrambi vanno bene; Questo viene indicato nel the specification:

... Così la chiamata di funzione Error(…) equivale all'espressione creazione dell'oggetto new Error(…) gli stessi argomenti.

+0

È vero anche in ES6? – paulmelnikow

11

Error fa agire come una fabbrica, in realtà quasi tutti i costruttori nativi fanno: Array, Object, ... tutto verifica qualcosa di simile if (!(this instanceof Array)){ return new Array(arguments);}

Detto questo, in caso di errore, non è nemmeno necessario per lanciare un oggetto Error ... throw 'Bad things happened'; funzionerà anche
si può anche buttare un oggetto letterale per il debugging:

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

Ho paura di non essere completamente d'accordo. 'String (" abc ")' non crea un oggetto 'String', mentre' new String ("abc") 'fa. – pimvdb

+1

@pimvdb: true, l'ho modificato in 'Object' =>' Object ('foo') 'restituisce un oggetto stringa ... vieni a trovarlo _qualcosa di più di tutti i costruttori nativi_ è un po 'sbagliato ...' Numero ',' Boolean', 'Date',' String' tutti no ... 'Array',' Object' e 'Error' do, ma' Event' e tutti i 'DOMxxxx'-api costruttori generano errori –

+0

I Penso che 'new Array (arguments)' non faccia esattamente ciò che fa 'Array (1, 2, 3) '. Ma probabilmente sto solo facendo il pelo nell'acqua :) – pimvdb