Скрытое свойство [[ErrorData]]

223
22 ноября 2017, 01:12

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
Answer 1

Как указано в спецификации:

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));

READ ALSO
Unexpected string

Unexpected string

ЗдравствуйтеНе могу понять, в чем заключается ошибка? Ошибка:

179
VueJS в Chrome Extension

VueJS в Chrome Extension

Привет всемЕсть проект (Chrome Extension)

223
Количество конечных нулей в факториале js

Количество конечных нулей в факториале js

Программа считает конечные нули n! Проблема такая: первый тест всегда выдает undefined, но все последующие значения считает верноВ чем может быть...

623