function PropertyError(property) {
this.name = "PropertyError";
this.property = property;
this.message = "Ошибка в свойстве " + property;
if (Error.captureStackTrace) {
Error.captureStackTrace(this, PropertyError);
} else {
this.stack = (new Error()).stack;
}
}
PropertyError.prototype = Object.create(Error.prototype);
Конструктор родителя здесь не обязателен
Обычно, когда мы наследуем, то вызываем конструктор родителя. В данном случае вызов выглядит как Error.call(this, message).
Строго говоря, этот вызов здесь не обязателен. Встроенный конструктор Error ничего полезного не делает, даже свойство this.message (не говоря уже о name и stack) не назначает. Единственный возможный смысл его вызова – он ставит специальное внутреннее свойство [[ErrorData]], которое выводится в toString и позволяет увидеть, что это ошибка. Поэтому по стандарту вызывать конструктор Error при наследовании в таких случаях рекомендовано.
Источник: Learn Javascript - Свои ошибки, наследование от Error.
Подскажите пожалуйста что за свойство [[ErrorData]]
?
Я просто попробовал проверить это свойство в контексте этого примера и мне выдало:
function PropertyError(property) {
Error.call(this, property) ;
this.name = "PropertyError";
this.property = property;
this.message = "Ошибка в свойстве " + property;
if (Error.captureStackTrace) {
Error.captureStackTrace(this);
} else {
this.stack = (new Error()).stack;
}
}
var a = new PropertyError('Hey');
var aa = Error('Hey');
console.log(String(a));
console.log(String(aa));
VM1377:19 [object Object]
VM1377:20 Error: Hey
Как указано в спецификации:
The only specified uses of [[ErrorData]] is to identify Error
and NativeError
instances as Error objects within Object.prototype.toString
.
[[ErrorData]]
используется только для определения того, что объекты классов Error
и NativeError
являются объектами ошибки при передаче их в Object.prototype.toString
Если пройти в Object.prototype.toString
, то можно увидеть следующую проверку
Else if O
has an [[ErrorData]] internal slot, let builtinTag be "Error".
Если у O
есть внутренний слот [[ErrorData]]
, установить значение для builtinTag
в Error
.
В конечном итоге это нужно для вывода строки вида: "[object ", tag, "]"
В случае Error
она будет выглядеть так: [object Error]
Вместо вызова конструктора, переопределить это поведение можно установив объекту свойство с именем Symbol.toStringTag
var t = {
[Symbol.toStringTag]: "Error"
};
var t2 = {};
var t3 = new Error("err");
console.log(Object.prototype.toString.call(t));
console.log(Object.prototype.toString.call(t2));
console.log(Object.prototype.toString.call(t3));
Программа считает конечные нули n! Проблема такая: первый тест всегда выдает undefined, но все последующие значения считает верноВ чем может быть...