Есть ли недостатки в использовании функций стрелок в классах - PullRequest
0 голосов
/ 23 апреля 2020

При написании класса Typescript, такого как:

class Foo {
  bar() { }
}

Иногда полезно переписать это как:

class Foo {
  bar = () => { }
}

Основная причина заключается в том, что я могу передать bar в качестве обратного вызова для что-то еще, но сохраните ссылку this.

Однако это выглядит немного «странно». Функции и свойства имеют свой собственный синтаксис, и использование синтаксиса свойств для функции создает ощущение, что я поступаю неправильно.

Хотя преимущества очевидны. Обычно вы хотите, чтобы this ссылался на текущий экземпляр класса, поэтому в этом отношении он выглядит так, как будто, по умолчанию / вменяемое поведение , если вы не хотите this Быть связанным заново явно. Однако такая ситуация настолько редка, что, если бы я захотел использовать это поведение, я бы, вероятно, вообще оставил эти функции вне классов.

Так что мой вопрос: есть ли веские причины для , а не сделай это? Должны ли мы просто всегда использовать функции стрелок и отказаться от повторного связывания this, если это явно не требуется?

1 Ответ

5 голосов
/ 23 апреля 2020

Сохранение this одинаковым независимо от синтаксиса вызова - одна из причин, по которой следует использовать функции стрелок. bar = () => { } - это синтаксис именно для вашего случая использования.

Но есть некоторые различия, которые могут иметь значение.

class Foo {
  bar() { }
}

Это создает одну функцию, только один раз, и включает ее Foo.prototype.bar, и он связан исключительно с помощью синтаксиса вызова foo.bar(). Это быстро и эффективно использует память.

class Foo {
  bar = () => { }
}

Это создает функцию в конструкторе и привязывает this к экземпляру, независимо от того, как вызывается функция. Это медленнее, и каждый экземпляр теперь имеет уникальный функциональный объект в памяти, который он должен отслеживать.

Если вы создаете огромное количество экземпляров этого класса, а производительность важна для вашего проекта, вы может начать иметь проблемы с памятью, так как объем памяти каждого экземпляра выше.


При этом преждевременная оптимизация - это root всего зла. Используйте то, что легче для вас, если только вы не выполняете дорогостоящую обработку десятков тысяч экземпляров вашего класса за раз.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...