fırlatma hatası ('msg') ve yeni hata fırlatma ('msg')


165
var err1 = Error('message');
var err2 = new Error('message');

Fark ne? Onlara krom konsolunda bakıldığında, aynı görünüyorlar. Nesne ve aynı __proto__zincir üzerinde aynı özellikler . Neredeyse Errorbir fabrika gibi davranıyor.

Hangisi doğrudur ve neden?


5
Tüm yerel kurucular ECMAScript içinde tanımlanır, bunlar olmadan çağrıldıklarında ilgili davranışları dahil new.
Tembel Nefret Ediyorum

Yanıtlar:



17

Errordiğer bazı yerli kurucular gibi, bir fabrika gibi hareket etmez: Array, Objectvb gibi tüm onay şey if (!(this instanceof Array)) { return new Array(arguments); }. (Ama dikkat edin String(x)ve new String(x)çok farklı ve aynı şekilde Numberve için Boolean.)

Bununla birlikte, bir hata durumunda, bir Errornesneyi atmak bile gerekli değildir ... throw 'Bad things happened';aynı zamanda çalışacak
Bir hata ayıklama için bir nesneyi bile atabilirsiniz:

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

9
Korkarım tam olarak katılmıyorum. String("abc")bir Stringnesne oluşturmaz new String("abc").
pimvdb

2
@pimvdb: true, bunu için değiştirdik Object=> Object('foo')döner bir dize nesne ... bunun şey geliyor hemen hemen tüm yerli kurucular olan biraz yanlış ... Number, Boolean, Date, Stringtüm yapamaz ... Array, Objectve Erroryapmak, ama Eventve tüm DOMxxxx-api inşaatçılar hata atıyor
Elias Van Ootegem

Ben de new Array(arguments)tam olarak ne yaptığını sanmıyorum Array(1, 2, 3). Ama muhtemelen sadece
nitpicking

8
alex

11
@alex: Verilen, Errorörnek olmayanları (veya dizgi değişmez değerlerini) atmak yığın izini kaybeder. Bağlantılı makalede sadece bir nit-pick: arguments.calleekatı modda yasaktır
Elias Van Ootegem
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.