ESLint: Expected 'this' to be used by class method 'getTimeParts'.(class-methods-use-this)

ESLint ругается на отсутствие 'this' в методе 'getTimeParts'. Как можно исправить код в нужный формат?


    class DigitalClock {
          constructor(element) {
            this.element = element;
          }
        
          start() {
            this.update();
        
            setInterval(() => {
              this.update();
            }, 500);
          }
        
          update() {
            const parts = this.getTimeParts();
            const minuteFormatted = parts.minute.toString().padStart(2, '0');
            const timeFormatted = `${parts.hour}:${minuteFormatted}`;
            const amPm = parts.isAm ? 'AM' : 'PM';
        
            this.element.querySelector('.clock-time').textContent = timeFormatted;
            this.element.querySelector('.clock-ampm').textContent = amPm;
          }
        
          getTimeParts() {
            const now = new Date();
        
            return {
              hour: now.getHours() % 12 || 12,
              minute: now.getMinutes(),
              isAm: now.getHours() < 12,
            };
          }
        }
        
        const clockElement = document.querySelector('.clock');
        const clockObject = new DigitalClock(clockElement);
        
        clockObject.start();


Ответы (1 шт):

Автор решения: Leonid

Объявленый метод getTimeParts() не обращается к экземпляру класса с использованием ключевого слова this, поэтому ESLint считает (достаточно логично), что эта функция могла бы быть размещена и вне объявления класса. Ведь она не потребляет и не преобразовывает какие-либо свойcтва объекта, методом которого она должна являться.

Казалось бы объявление метода с ключевым словом static решает проблему, но теперь из самого экземпляра класса - объекта - доступа к этому методу не будет. Обращаться к нему можно только DigitalClock.getTimeParts() - как к методу самого класса как функции.

Если убрать синтаксис class, то ваш код можно переделать следующим образом. И здесь хорошо видно, что статический метод - это просто свойство функции-конструктора (функция является объектом, а объекту можно добавлять свойства). Поэтому и в DigitalClock.prototype.update() идет обращение к DigitalClock.getTimeParts() , а не к this.getTimeParts().

function DigitalClock(element) {
    this.element = element;
}

DigitalClock.prototype.start = function(){
    this.update();

    setInterval(() => {
    this.update();
    }, 500);
};

DigitalClock.prototype.update = function(){
    const parts = DigitalClock.getTimeParts();
    const minuteFormatted = parts.minute.toString().padStart(2, '0');
    const timeFormatted = `${parts.hour}:${minuteFormatted}`;
    const amPm = parts.isAm ? 'AM' : 'PM';

    this.element.querySelector('.clock-time').textContent = timeFormatted;
    this.element.querySelector('.clock-ampm').textContent = amPm;
}

DigitalClock.getTimeParts = function(){
    const now = new Date();

    return {
    hour: now.getHours() % 12 || 12,
    minute: now.getMinutes(),
    isAm: now.getHours() < 12,
    };
}

const clockElement = document.querySelector('.clock');
const clockObject = new DigitalClock(clockElement);

clockObject.start();
<div class="clock">
    <div class="clock-time"></div>
    <div class="clock-ampm"></div>
  
</div>

В целом, необращение к this внутри метода класса не является ошибкой. Отчасти, это можно считать логическим недоразумением - не больше. Код будет работать.

→ Ссылка