Запуск метода объекта, который вскоре будет заменен - PullRequest
0 голосов
/ 20 декабря 2011

Учитывая эту переменную:

somevar = {dothis: function(){console('yay')}};

Если я захочу ее взломать, я подумаю, что я бы сделал что-то вроде:

tempvar = somevar;
somevar = function(){ console.log('yoink'); tempvar();};

Но если бы я знал, что переменнаябудет переопределен через 60 секунд, и я хочу перехватить его через 65 секунд, как мне это сделать?Не будет ли setTimeout сразу проанализировать функцию, а затем обратиться к старой угнанной функции?

Заранее спасибо.

1 Ответ

2 голосов
/ 20 декабря 2011

Попробуйте что-то вроде этого:

// initial data
var somevar = {
  dothis: function(){
    console.log('yay');
  }
};

somevar.dothis(); // output: yay

// hijacking in 1 second
setTimeout(function () {
    console.log('hijacking');
    somevar.dothis = (function (orig) {
        return function () {
            console.log('yoink');
            orig.apply(this, arguments);
        };
    }(somevar.dothis));
}, 1000);

// saved reference running 1.5 seconds later (0.5 seconds after hijacking)
setTimeout(somevar.dothis, 1500); // output (still): yay

// live reference running 2 seconds later (1 second after hijacking)
setTimeout(function () {
  somevar.dothis(); // output: yoink / yay
}, 2000);

демо: http://jsfiddle.net/MDLZt/

...