Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 11.04.2016, 10:49
Аватар для woojin
Аспирант
Отправить личное сообщение для woojin Посмотреть профиль Найти все сообщения от woojin
 
Регистрация: 13.08.2012
Сообщений: 38

this не в контексте объекта
есть такой объект:
var answerTimer = {
    this: answerTimer,
    timerAnswer: -1,
    answerTimerId: null,
    timer: function () {
        ++this.timerAnswer;
        this.toPrint();
        this.answerTimerId = setTimeout(this.timer, 1000);
    },
    reset: function () {
        this.timerAnswer = 0;
    },
    stop: function () {
        this.reset();
        clearTimeout(this.answerTimerId);
    },
    toPrint: function () {
        document.getElementById("answerTimer").innerHTML = "last answer: " + this.timerAnswer + " sec";
    },
};

при вызове setTimeout из первой функции, в this оказывается контекст window!
как сделать что бы this был в контекст самого объекта?

Последний раз редактировалось woojin, 11.04.2016 в 10:52.
Ответить с цитированием
  #2 (permalink)  
Старый 11.04.2016, 11:05
Аватар для nerv_
junior
Отправить личное сообщение для nerv_ Посмотреть профиль Найти все сообщения от nerv_
 
Регистрация: 29.11.2011
Сообщений: 3,924

setTimeout(this.timer.bind(this), 1000);
__________________
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук
Ответить с цитированием
  #3 (permalink)  
Старый 11.04.2016, 11:12
Аватар для woojin
Аспирант
Отправить личное сообщение для woojin Посмотреть профиль Найти все сообщения от woojin
 
Регистрация: 13.08.2012
Сообщений: 38

спасибо!

а, автоматизировать эту "биндовку" ни как нельзя?
к примеру добавить функцию которая при создании объекта сама сразу привязывала все методы и переменные к данному объекту?

Последний раз редактировалось woojin, 11.04.2016 в 11:18.
Ответить с цитированием
  #4 (permalink)  
Старый 11.04.2016, 11:22
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,121

woojin,
<div id="timer"></div>
 <script>
 var answerTimer = {
    timerAnswer: 0,
    answerTimerId: null,
    timer: function () {
        this.toPrint();
        ++this.timerAnswer;
        var self = this;
        this.answerTimerId = setTimeout(function() {
        self.timer()
}, 1000);
    },
    reset: function () {
        this.timerAnswer = 0;
    },
    stop: function () {
        this.reset();
        clearTimeout(this.answerTimerId);
    },
    toPrint: function () {
        document.getElementById("timer").innerHTML = "last answer: " + this.timerAnswer + " sec";
    }
};
  answerTimer.timer();
  setTimeout(function() {
        answerTimer.stop()
}, 5054);

  </script>
Ответить с цитированием
  #5 (permalink)  
Старый 11.04.2016, 12:44
Аватар для ruslan_mart
Профессор
Отправить личное сообщение для ruslan_mart Посмотреть профиль Найти все сообщения от ruslan_mart
 
Регистрация: 30.04.2012
Сообщений: 3,018

(function(window) {
    var setTimeout = window.setTimeout;
    window.setTimeout = function(callback, delay, context) {
         setTimeout(callback.bind(context), delay);
    };
})(window);
/***********************/



var obj = {
    fn: function() {
        alert(this.foo);
    },
    foo: 'bar'
};

setTimeout(obj.fn, 1000, obj);
Ответить с цитированием
  #6 (permalink)  
Старый 11.04.2016, 13:52
Аватар для nerv_
junior
Отправить личное сообщение для nerv_ Посмотреть профиль Найти все сообщения от nerv_
 
Регистрация: 29.11.2011
Сообщений: 3,924

woojin, правильный вариант того, что ты хочешь сделать, выглядит как-то так

function Timer(selector) {
  this.id = null;
  this.element = document.querySelector(selector);
  this.tick = this.tick.bind(this);
  this.reset();
}

Timer.prototype.start = function() {
  this.reset();
  this.id = setTimeout(this.tick, 1000);
};
Timer.prototype.tick = function() {
  this.print();
};
Timer.prototype.reset = function () {
  this.timestamp = Date.now();
};
Timer.prototype.stop = function () {
  this.reset();
  clearTimeout(this.this.id);
};
Timer.prototype.print = function () {
  var diff = Date.now() - this.timestamp; // ms
  var seconds = Math.ceil(diff / 1000);
  this.element.innerHTML = "last answer: " + seconds + " sec";
};

// usage

var timer = new Timer("#answerTimer");
timer.start();
__________________
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук

Последний раз редактировалось nerv_, 11.04.2016 в 13:55.
Ответить с цитированием
  #7 (permalink)  
Старый 16.04.2016, 12:16
Аватар для woojin
Аспирант
Отправить личное сообщение для woojin Посмотреть профиль Найти все сообщения от woojin
 
Регистрация: 13.08.2012
Сообщений: 38

это самый интересный вариант - спасибо!

P.S. вопрос не по теме: а как тогда JQ активируется без привязки к какому либо селектору?
Ответить с цитированием
  #8 (permalink)  
Старый 20.04.2016, 17:10
Аспирант
Отправить личное сообщение для orionpro Посмотреть профиль Найти все сообщения от orionpro
 
Регистрация: 23.12.2015
Сообщений: 39

Я вот не пойму, это типа такой приём используется ,чтобы показать, когда был написан комментарий или сообщение отправлено?
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Замыкание как аякс функция и ее данные Zalex Общие вопросы Javascript 0 06.06.2015 15:16
Canvas. Как сделать или вообще нельзя? Вращение рандомизированно изменяемого объекта. Zemsky Общие вопросы Javascript 30 19.12.2013 19:44
динамическое обновление свойств объекта в цикле grego Общие вопросы Javascript 3 04.12.2013 23:29
Скрипт вычисления координат объекта banderasantonio197555 Events/DOM/Window 4 16.08.2011 17:37
Можно ли получить имя экземпляра объекта внутри самого объекта? Ichigeki Общие вопросы Javascript 9 14.11.2008 19:00