Допустим есть класс 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.
Можно поправить это двумя способами:
- Добавить в конструктор
this.handler = this.handler.bind(this); - В методе
listen()сделатьhttp.createServer((req, res) => this.handler(req, res)).listen(port);
Но ходят слухи, что bind плохо влияет на производительность, а второй способ - очевидный костыль. Как в мире Node.js принято поступать в подобных случаях?
Мне хотелось бы знать, как правильно управлять контекстом с точки зрения производительности в Node.js. Повлияет ли на производительность bind в конструкторе? Или может быть стоит писать всё функциями а не классами?