Как получить доступ к this объекта внутри метода в котором есть вложенная функция?

у объекта есть метод:

move(){
        setInterval(function(){
        
            if(this.direction==0){  
          this.moveRight;         
          console.log("try move right");     
        }
        else
        if(this.direction==1){          
          this.moveLeft;           
          console.log("try move left");       
        }
        else
        if(this.direction==2){          
          this.moveUp;         
          console.log("try move up");         
        }
        else
        if(this.direction==3){          
          this.moveDown;           
          console.log("try move down");       
        }
        else{
            console.log("i am standing...");
        }
        return this;
        },1000);
}

как можно заставить выполняться методы this.moveRight, this.moveLeft, this.moveUp, this.moveDown?

на данный момент контекст this - это Window, а методов - undefined.


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

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

Пример функции-конструктора, которая создает объект, колбэк-функцию для setInterval оформлено стрелочной функцией для сохранения значения this (сам объект). Методы вызываются как и обычные функции с добавлением круглых скобок.

Объявил метод moveRight отдельно для демонстрации работы кода.

Справка:

this
Методы объекта и this
Стрелочные функции
Привязка контекста

function Mover () {
    this.direction = 0;
    
    this.moveRight = function() {
      console.log('moving right');
    }
    
    this.move = function(){
        setInterval( ()=> {
        
        if(this.direction==0){  
          this.moveRight();         
          console.log("try move right");     
        }
        else
        if(this.direction==1){          
          this.moveLeft();           
          console.log("try move left");       
        }
        else
        if(this.direction==2){          
          this.moveUp();         
          console.log("try move up");         
        }
        else
        if(this.direction==3){          
          this.moveDown();           
          console.log("try move down");       
        }
        else{
          console.log("i am standing...");
        }
        return this;
        },1000);
  }
}

let runner = new Mover();
runner.move();

→ Ссылка