Перейти к основному содержимому

Классы и this

MobX позволяет создавать наблюдаемые состояния как с помощью объектов, так и с помощью классов. В книге мы будем использовать примеры на классах, т.к. с классами вы можете использовать модификаторы доступа, а ещё с ними лучше работает вывод типов TS (об этом отдельная глава для продвинутых).

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

Итак, классы определяются с помощью ключевого слова class:

class User {}

Поля класса​

Класс описывает состояние (свойства, характеристики) объекта:

class User {
name = 'Anon'
age?: number
}

Мы можем присвоить полям класса начальные значения (как для isAuthorized и name). Если мы не определили (undefined) значения для поля, то необходимо указать его тип (как number для age).

Методы класса​

Помимо хранения данных, мы можем определить методы, которые описывают поведение класса.

class User {
name = 'Anon'

greeting() {
console.log('Hello', this.name)
}
}

Экземпляр класса​

С помощью ключевого слова new мы можем создать объект, который представляет собой экземпляр (инстанс) класса.

class User {
name = 'Anon'

greeting() {
console.log('Hello', this.name)
}
}

const user = new User()

This​

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

В ECMAScript 5 для привязки значения this был создан метод bind. В MobX для привязки экшенов к экземпляру можно использовать аннотацию action.bound или передать параметр autoBind.

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

class User {
name = 'Anon'

greeting = () => {
console.log('Hello', this.name)
}
}

Более подробно работа с this рассмотрена в главе Все сценарии потери реактивности.