Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   ООП. Не виден объект из метода. (https://javascript.ru/forum/misc/2221-oop-ne-viden-obekt-iz-metoda.html)

Flake 21.11.2008 13:22

ООП. Не виден объект из метода.
 
Здравствуйте.

Есть класс:
function Emulator(id)
{
	this.object_id = id;
	this.velocity = document.getElementById("velocity"+this.object_id).value;
	this.track = document.getElementById("track"+this.object_id).value;

	this.xmlHttp = createXmlHttpRequestObject();
  
  this.loadObjects = function()
	{
		if (this.xmlHttp && (this.xmlHttp.readyState == 4 || this.xmlHttp.readyState == 0))
    {
      var query = "emulation.php?track="+this.track+"&object_id="+this.object_id+"&velocity="+this.velocity;
  		this.xmlHttp.open("GET", query, true);
  		this.xmlHttp.onreadystatechange = this.handleLoadObjects;
  		this.xmlHttp.send(null);
    }
	}
	
	this.handleLoadObjects = function()
	{
    if (this.xmlHttp.readyState == 4 && this.xmlHttp.status == 200)
    {
      alert("ok");
    }
  }
}


При его вызове:
var em = new Emulator(1);
  em.loadObjects();

Отправка данных происходит нормально. Но в обработчике handleLoadObjects не видит this.xmlHttp, т.е. ругается: Ошибка: this.xmlHttp is undefined.

Какой синтаксис будет правильным?

Kolyaj 21.11.2008 13:26

Самым простым выходом будет инициализация в начале функции loadObjects
var self = this;
И потом уже использовать self вместо this.

http://javascript.ru/tutorial/object/thiskeyword

ZoNT 21.11.2008 13:27

var t = this;
this.handleLoadObjects = function() {
    if (t.xmlHttp.readyState == 4 && t.xmlHttp.status == 200)  {
      alert("ok");
    }
}


аааа, не успел :)

Flake 21.11.2008 13:31

Спасибо мужики :)

Flake 21.11.2008 13:53

Возник ещё вопрос.
Мне из handleLoadObjects надо вызвать loadObjects с паузой.

var myFunc = 't.loadObjects("'+object_id+'", "'+velocity+'", "'+track+'")';
setTimeout(myFunc, 3000);

Ругается что t - неизвестен.

ZoNT 21.11.2008 14:01

вызов будет осуществляться в глобальном контексте... А там t неопределён...

Flake 21.11.2008 14:05

И как тогда будет правильно?

Kolyaj 21.11.2008 18:30

setTimeout(function() { self.loadObjects(); }, 10);


Часовой пояс GMT +3, время: 03:44.