Как сохранить переменную this в JS? - PullRequest
0 голосов
/ 31 августа 2018

function Device(socket) {

  this.imei = false;
  this.status = false; //maintaining the logged in status
  let self = this; //saving this variable

  this.on('data', function() { //Event on the device object

    //I want to access self.imei

  });

  Device.prototype.saveLocation = function(parts) {
    //Here the value of self changes to the value of self of the recent object created
    console.log("In save location : IMEI " + self.imei);


  };
}

Я создаю новые объекты класса устройств и хотел сохранить значение «this» каждого объекта в собственной переменной, чтобы я мог использовать его в обратных вызовах без каких-либо хлопот. Но происходит то, что когда создаются два объекта a и b, значение self объекта a также изменяется на значение b, что дает неоднозначные результаты. Может кто-нибудь объяснить, почему? Новые устройства, которые подключаются к серверу, изменяют собственные значения каждого предыдущего объекта.

const server = net.createServer(function (socket) {
    socket.name = socket.remoteAddress + ":" + socket.remotePort;
    socket.device = new Device(socket);
    clients.push(socket);
    let bufferString = 'cddwcdc';
    socket.emit('data',bufferString);
});

1 Ответ

0 голосов
/ 31 августа 2018

Проблема в том, что есть только одна функция Device.prototype.saveLocation. Каждый раз, когда вы создаете новое устройство, вы перезаписываете эту функцию самой последней, которая имеет последнее значение self.

Функции прототипа не должны создаваться в конструкторе, они должны быть определены только один раз. Ему не нужно использовать self, потому что он получает объект, который вызывается как this.

Вам нужно использовать self только в функциях обратного вызова, определенных в конструкторе, а не в методах объекта или прототипа.

Так и должно быть.

function Device(socket) {

  this.imei = false;
  this.status = false; //maintaining the logged in status
  let self = this; //saving this variable

  this.on('data', function() { //Event on the device object

    //I want to access self.imei

  });
}

Device.prototype.saveLocation = function(parts) {
  //Here the value of self changes to the value of self of the recent object created
  console.log("In save location : IMEI " + this.imei);
};

Вы также можете определить функцию обратного вызова, используя функцию стрелки, тогда она наследует this от того места, где она была определена.

function Device(socket) {

  this.imei = false;
  this.status = false; //maintaining the logged in status
  let self = this; //saving this variable

  this.on('data', () => { //Event on the device object

    //You can access this.imei here

  });
}

Device.prototype.saveLocation = function(parts) {
  //Here the value of self changes to the value of self of the recent object created
  console.log("In save location : IMEI " + this.imei);
};
...