Установка метода в setTimeout()

camka

не самка
Установка метода в setTimeout()

Начал разбирать ОО в яваскрипт и наткнулся на такую проблему. Хочу устанавливать свои таймауты для каждого из создаваемых объектов. Казалось бы, что может быть легче, передаешь в window.setTimeout соответствующий метод объекта и ждешь, когда он вызовется. Но не тут то было. Если в вызываемом методе имеется вызов некоего другого метода того же объекта, то он не находится, и выдается сообщение:

Код:
Error: this.killtimer is not a function
Source File: [url]http://localhost/test/jsclass.html[/url]
Line: 25
Пробовал передавать функцию как строку - setTimeout("this.function()", delay) он ее даже вызвать не сумел.


PHP:
<html>
<head>
<title>JS class</title>
</head>
<body>
<script>

function myclass()
{
	var timer = null;

	this.setTime = function ()
	{
		timer = window.setTimeout(afterTimeout, 1000);
	}

	this.killtimer = function ()
	{
		alert('this.killtimer');
		window.clearTimeout(timer);
	}

	var afterTimeout = function()
	{
		this.killtimer();
	}
}

var obj = new myclass();
obj.setTime();

</script>
</body>
</html>
Видимо, проблема заключается в том, что в области видимости переменных на момент вызова функиции, переданной в setTimeout, объект this не определен.

Как побороть сию проблему?
 

Profic

just Profic (PHP5 BetaTeam)
PHP:
this.setTime = function() { 
    timer = window.setTimeout(function() {
        var _this = this;
        _this.afterTimeout()
    }, 1000); 
}
?
Это в принципе то же самое, только объекты не глобальные :)
 

camka

не самка
Profic
Не работает.
Код:
Error: _this.afterTimeout is not a function
Source File: [url]http://localhost/test/jsclass.html[/url]
Line: 16
Я спасся, продублировав код метода this.killtimer внутри afterTimeout.
Есть еще идея подставить при установке таймаута не this, а имя самого объекта. Возможно, хитрый яваскрипт содержит где-то в закромах имя объекта? Тогда бы можно было написать setTimeout(this.objectname+'.afterTimeout()', 1000) и, при вызове область видимости была бы как раз нужная. Но мои потуги в поисках подобного свойства не увенчались успехом. Возможно, кто-то может сказать определенно, есть такое свойство или нет.
спасибо.

-~{}~ 04.11.05 12:33:

Заработало!!!
PHP:
function createFUN(obj)
{
	return (function(){obj.afterTimeout()});
}

...

timer = window.setTimeout(createFUN(this), 500);

...
-~{}~ 04.11.05 12:43:

или так
PHP:
timer = window.setTimeout(function(obj){return function(){obj.afterTimeout()}}(this), 1000);
 

Profic

just Profic (PHP5 BetaTeam)
camka
Я немного перепутал:
PHP:
this.setTime = function() { 
    var _this = this; 
    timer = window.setTimeout(function() { _this.afterTimeout() }, 1000); 
}
Т.е. _this нужно создавать вне функции.
 

camka

не самка
Поправка: метод afterTimeout, конечно, должен быть public, то бишь объявлен как:

this.afterTimeout = function () ...
 
Сверху