Как получить this класса внутри его метода?

Такие дела:
const show = element => {
  element.classList.add('show');
}

class Modal {
  constructor() {
    this.modal = document.get...
  }

  open(endAction) {
    show(this.modal);
    
    endAction();
  }
}

class Slider {
  constructor() {
    this.overlay = document.get...;
  }

  openSlider() {
    show(this.overlay);
    console.log(this); // undefined
  }

  openModal() {
    const modal = new Modal();

    modal.open(this.openSlider);
  }
}

Вот урезанный и облегченный код.

При вызове openSlider() на функцию show() выдает ошибку, на console.log() выдает undefined.

Почему так? Как быть в такой ситуации?
  • Вопрос задан
  • 301 просмотр
Решения вопроса 1
@Faliah
Контекст this теряется, если ваш метод вызывается не из экземпляра класса, в котором он объявлен. Нужно использовать bind, чтобы привязать функцию к экземпляру.
const show = element => {
  element.classList.add('show');
}

class Modal {
  constructor() {
    this.modal = document.get...
  }

  open(endAction) {
    show(this.modal);
    
    endAction();
  }
}

class Slider {
  constructor() {
    this.overlay = document.get...;
  }

  openSlider() {
    show(this.overlay);
    console.log(this); // Slider
  }

  openModal() {
    const modal = new Modal();

    modal.open(this.openSlider.bind(this));
  }
}


Или с ES6 стрелочной функцией, результат один и тот же:

const show = element => {
  element.classList.add('show');
}

class Modal {
  constructor() {
    this.modal = document.get...
  }

  open(endAction) {
    show(this.modal);
    
    endAction();
  }
}

class Slider {
  constructor() {
    this.overlay = document.get...;
  }

  openSlider() {
    show(this.overlay);
    console.log(this); // Slider
  }

  openModal() {
    const modal = new Modal();

    modal.open(() => this.openSlider());
  }
}
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы