0

Допустим есть класс Foo, который поднимает http сервер:

const http = require("http");

class Foo { constructor(bar) { this.bar = bar; }

listen(port) { http.createServer(this.handler).listen(port); }

handler(req, res) { console.log(this.bar); } }

new Foo("test").listen(3000);

В handler'е (обработчике запросов к серверу) должны использоваться поля этого класса, но в данном случае, в handler, контекст this указывает на экземпляр http, а не на Foo и this.bar соответственно вернет undefined.

Можно поправить это двумя способами:

  1. Добавить в конструктор this.handler = this.handler.bind(this);
  2. В методе listen() сделать http.createServer((req, res) => this.handler(req, res)).listen(port);

Но ходят слухи, что bind плохо влияет на производительность, а второй способ - очевидный костыль. Как в мире Node.js принято поступать в подобных случаях?

Мне хотелось бы знать, как правильно управлять контекстом с точки зрения производительности в Node.js. Повлияет ли на производительность bind в конструкторе? Или может быть стоит писать всё функциями а не классами?

posix
  • 359
  • 2
  • 21
  • Не совсем так. Я понимаю почему это происходит и я знаю как это поправить. Вопрос в том, как лучше сделать это с точки зрения производительности, причем применительно к node, а не к браузерному js. – posix Sep 01 '20 at 13:26
  • никакой разницы нет - v8 и там и там – Grundy Sep 01 '20 at 13:32
  • Почему стрелочная функция костыль? – Alex Sazonov Sep 01 '20 at 13:33
  • @Grundy, хорошо, но даже в этом случае остаётся куча вопросов: например как лучше биндить метод, в конструкторе класса или прямо в createServer. Или рациональнее переписать без использования класса, чтобы в createServer передавалсь простая функция. – posix Sep 01 '20 at 13:36
  • @Alex Sazonov, мне показалось немного странным вот так вот "проксировать" функцию: вызывать одну функцию из другой только для сохранения контекста. Или это нормальная практика? Что лучше - такой подход или bind? – posix Sep 01 '20 at 13:38
  • 1
    @posix я стрелочными пользуюсь везде, где можно. Зачем мне байнды лепить? :) Не костыль, а вполне рабочий инструмент. – Alex Sazonov Sep 01 '20 at 13:39
  • 1
    @AlexSazonov, в большинстве случаев ты на заметишь разницы – Grundy Sep 01 '20 at 13:47
  • @AlexSazonov, второй способ, когда ты делаешь обертку из стрелочной функции - по сути тот же bind – Grundy Sep 01 '20 at 13:57
  • @Grundy верно. Но я имел ввиду, что не вообще везде тулю стрелки к месту и не к месту, а где можно избежать таким образом вещей типа байндов, то грех не пользоваться :) Почитал твой ответ про контекст. Благодарствую за развёрнутое объяснение :) – Alex Sazonov Sep 01 '20 at 13:57
  • @AlexSazonov, кстати, я похоже вместо автора тебя указал в комментарии про разницу :-) странно – Grundy Sep 01 '20 at 13:58
  • Огромное всем спасибо, вроде бы уложил всё в голове. – posix Sep 01 '20 at 14:24

0 Answers0