Ответ 1
Оба хороши; это явно указано в спецификация:
... Таким образом, вызов функции
Error(…)
эквивалентен выражению создания объектаnew Error(…)
с теми же аргументами.
var err1 = Error('message');
var err2 = new Error('message');
Какая разница? Глядя на них в хром-консоли, они выглядят одинаково. Те же свойства на объекте и в той же цепочке __proto__
. Почти похоже на то, что Error
действует как factory.
Какой из них правильный и почему?
Оба хороши; это явно указано в спецификация:
... Таким образом, вызов функции
Error(…)
эквивалентен выражению создания объектаnew Error(…)
с теми же аргументами.
Error
действует как фабрика, как и некоторые другие собственные конструкторы: Array
, Object
и т.д., Все проверяют что-то вроде if (!(this instanceof Array)) { return new Array(arguments); }
if (!(this instanceof Array)) { return new Array(arguments); }
(Но обратите внимание, что String(x)
и new String(x)
очень разные, а также для Number
и Boolean
.)
Тем не менее, в случае ошибки, даже не требуется бросать объект Error
... throw 'Bad things happened';
тоже будет работать
Вы даже можете бросить объектный литерал для отладки:
throw {message:"You've been a naughty boy",
context: this,
args: arguments,
more:'More custom info here'};