Какая фича JavaScript используется под капотом у MobX

Ответ

MobX использует декораторы (декораторы свойств @observable, @computed, @action) и Proxy API (в современных версиях) для отслеживания изменений в данных.

Пример:

import { observable, computed, action } from "mobx";

class Store {
  @observable count = 0;

  @computed get doubleCount() {
    return this.count * 2;
  }

  @action increment() {
    this.count++;
  }
}

Proxy позволяет MobX перехватывать обращения к свойствам и автоматически управлять реактивностью без декораторов (если используется makeObservable/makeAutoObservable).

Важно:

  • В старых версиях MobX использовал Object.defineProperty.
  • Современные версии полагаются на Proxy для лучшей производительности и поддержки динамических свойств.

Ответ 18+ 🔞

А, MobX, говоришь? Ну это ж, блядь, как в цирке с дрессированными данными! Сидит такой объект, а за ним, сука, невидимый клоун-надзиратель следит, чтоб никто не сходил с ума без спросу.

Смотри, как раньше-то было, в старые добрые времена. Пили они, блядь, из Object.defineProperty, как из старой фляги. Замудрённо, негибко, динамические свойства не ловили. Ну, в общем, как доить ёжика в рукавицах.

А щас, охуенно, перешли на Proxy API — это как поставить на каждый объект скрытую камеру с датчиком движения. Полез кто-то в свойство (this.count), вызвал метод — Proxy сразу сигнализирует: «Э, сабака, сука, тут движение!». И вся реактивность, блядь, просыпается, как от запаха жареного.

Ну и декораторы эти, @observable, @computed, @action — это такие, блядь, ярлычки-напоминалки. Вешаешь на свойство — и всем становится ясно: «Чувак, за мной следят, я реактивный!». Без них, конечно, тоже можно, через makeAutoObservable, но это как ехать на авто без руля — вроде едет, но непонятно, кто кем управляет.

Вот смотри на этот код, тут всё прозрачно, как слёзы ребёнка, которого заставили учить MobX:

import { observable, computed, action } from "mobx";

class Store {
  @observable count = 0; // Следи за этой переменной, как ястреб! Изменится — всем пизда.

  @computed get doubleCount() { // Это не просто геттер, это хитрая жопа!
    return this.count * 2;      // Само пересчитается, только count чихнет.
  }

  @action increment() { // Все изменения — только через турникет экшена!
    this.count++;       // Иначе MobX охуеет и ничего не заметит.
  }
}

И главное, запомни:
Раньше следили в замочную скважину (Object.defineProperty), а сейчас — через спутниковый шпионаж (Proxy). Результат один, но щас, блядь, овердохуища возможностей и скорость — просто хуй с горы летит. Вот и вся магия, ебать мои старые костыли.