Значения свойств внутри двух функций-прототипов не совпадают - PullRequest
0 голосов
/ 26 июня 2019

Я инициализирую свой this.interval = null в конструкторе, а затем хочу изменить этот последний в prototype.blink, но когда я поддерживаю его внутри prototype.stopBlink (), он дает нулевое значение

function Mesh(name, material) {
  this._name = name;
  this._material = material;
  this.interval = null;
}

Mesh.prototype.blink = function(obj, delay, box) {
  this.interval = (() => {
    var Toggle = true
    return setInterval(() => {
      if (Toggle)
        changeMaterial(obj, box);
      else {
        changeMaterial(obj, this._material);
      }

      Toggle = !Toggle;
    }, delay);
  })();

  console.log(this.interval);
}

Mesh.prototype.stopBlink = function(obj, duration) {

  setTimeout(function() {
    console.log(this.interval);

    clearInterval(this.interval);
  }, duration);
}

Ответы [ 2 ]

1 голос
/ 26 июня 2019

Вот рабочий пример, приведенный к основным движущимся частям. Он использует функцию стрелки внутри stopBlink setTimeout. Это важно, потому что вы хотите получить значение this лексически, а не из вызова по тайм-ауту. Непонятно, почему вы используете немедленно возвращенную функцию внутри blink(), но я оставил ее:

function Mesh(name) {
  this._name = name;
  this.interval = null;
}

Mesh.prototype.blink = function(delay) {
  var Toggle = false
  this.interval = (() => {
    return setInterval(() => {
      console.log(this._name, " blinking ", "Toggle", Toggle)
      Toggle = !Toggle;
    }, delay);
  })();
  console.log("interval in blink:", this.interval)

}

Mesh.prototype.stopBlink = function(duration) {

  setTimeout(() => {
    console.log("interval in stop: ", this.interval)
    clearInterval(this.interval);
  }, duration);
}

let m = new Mesh("mesh")
m.blink(200)
m.stopBlink(1000)
1 голос
/ 26 июня 2019

Так же, как sjahan написал для вас, в вашей функции setTimeout ключевое слово this больше не указывает на экземпляр класса, а скорее на объект окна.

используйте вместо этого функцию стрелки, измените

Mesh.prototype.stopBlink = function(obj, duration) {

  setTimeout(function() {
    console.log(this.interval);

    clearInterval(this.interval);
  }, duration);
}

на

Mesh.prototype.stopBlink = function(obj, duration) {

  setTimeout(() => {
    console.log(this.interval);

    clearInterval(this.interval);
  }, duration);
}
...