JavaScript / NodeJS: проверка instanceof для родительского метода - PullRequest
0 голосов
/ 30 октября 2018

В реализации Solid NodeJS я вижу следующее:

module.exports = HTTPError

function HTTPError (status, message) {
  if (!(this instanceof HTTPError)) {
    return new HTTPError(status, message)
}

Какой смысл в этом? В каком случае указанный экземпляр метода не пройдет проверку instanceof? Я предполагаю, что это не избыточно, как я сейчас об этом думаю, но не могу найти логику за этим.

Ссылка на указанный код на GitHub

Ответы [ 3 ]

0 голосов
/ 30 октября 2018

Цель проверки this instanceof HTTPError состоит в том, чтобы класс вызывался как обычная функция. HTTPError класс имитирует встроенные классы JavaScript, такие как Error, которые могут быть созданы с new:

и без него
Error() instanceof Error; // true
HTTPError() instanceof HTTPError; // true
0 голосов
/ 30 октября 2018

Это позволяет использовать оба вызова как экземпляр класса:

let myError = new HTTPError('status', 'message');

и как вызов функции:

let myError = HTTPError('status', 'message');

В случае вызова функции, this не определено в теле функции, поэтому возвращение new HTTPError создаст экземпляр класса.

0 голосов
/ 30 октября 2018

Разница возникает в зависимости от наличия ключевого слова new. Рассмотрим следующий пример:

function HTTPError(status, message) {
  if (!(this instanceof HTTPError)) {
    console.log("called without new. Status is " + status);
    return new HTTPError(status, message)
  } else {
    console.log("called with new. Status is " + status);
  }
  this.status = status;
}

const i = HTTPError(500);
const i2 = new HTTPError(400);
console.log(i);
console.log(i2);
...