-1

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

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.

Ihor
  • 1

1 Answers1

2

Пример функции-конструктора, которая создает объект, колбэк-функцию для 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();

highpassion
  • 1,806
  • 1
    Спасибо! Использовал стрелочные функции и все заработало. До этого пытался привязать контекст this при помощи bind(this), но это по-прежнему не возвращало ссылку на сам объект. Очень благодарен – Ihor Sep 14 '21 at 07:08
  • @Ihor можете помещать this в переменную - let t = this; – highpassion Sep 14 '21 at 07:12