Одна из проблем использования this
заключается в том, что this
зависит от способа вызова функции.
setInterval
будет вызывать ваш метод update
, как если бы это была отдельная функция, поэтому this
будет установлен в глобальный объект.
Если вам действительно нужно использовать функциональность this
, перепишите ваш вызов setInterval следующим образом:
function Net() {
var self = this;
this.connection = -1;
this.counter = 1;
this.timelastsend = -1;
setInterval( function () { self.update() }, 3000);
}
Таким образом, вы создадите переменную self
, которая будет продолжать ссылаться на ваш объект (, если вы создали его с помощью оператора new
- еще одна причина избегать this
) .
Добавление:
Если вы не используете нисходящее множество объектов из своего псевдокласса Net, я бы выполнил рефакторинг следующим образом:
function createNet() {
var connection = -1,
counter = -1,
timelastsent = -1,
self,
update;
update = function () {
var now;
if (connection > 0 && timelastsent > 0) {
now = new Date().valueOf();
if (now - timelastsent > 1000 * 60) {
// ... update code ...
counter += 1;
timelastsent = now;
}
}
};
setInterval(update, 3000);
return {
update: update,
getTimeLastSent: function () { return timelastsent; },
getCounter: function () { return counter; },
getConnection: function () { return connection; }
};
}
Вы заметите, что нигде не упоминается this
, что означает отсутствие двусмысленности. Я включил три метода получения для свойств подключения, счетчика и timelastsent, но если вы хотите, чтобы они были доступны для записи извне объекта, вы можете с легкостью добавить их в созданный объект.