Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   Передача события обработчику внутри класса (https://javascript.ru/forum/events/26195-peredacha-sobytiya-obrabotchiku-vnutri-klassa.html)

SuperDennis 29.02.2012 15:46

Передача события обработчику внутри класса
 
Всем привет.

Пишу игру на JS. Пишу на чистом JS с использованием jQuery для облегчения многих задач. Написал класс для объекта карты Map:

var Map = function (map) {
	this.map = $(map);
};

// Place object on the map
Map.prototype.addObject = function(object_id) {
	this.map.append('<div id="' + object_id + '" />');
};

// Map events handler
Map.prototype.on = function (event, handler) {
	this.map.live(event, function (e) {
		handler(e);
	});
};


Далее создаю карту и хочу реализовать при клике добавление объекта в указанную точку карты (принимаем во внимание, что в body существует элемент <div id="map"></div>):

var map = new Map('#map');

map.on('click', function (e) {
	// Place tower on the map
	this.addObject('tower', {
		'left' : e.pageX,
		'top' : e.pageY
	});
});


Проблема: Хочу реализовать так, чтоб this во втором куске кода указывал на объект моего определенного выше типа Map и соответственно вызывал на нем метод addObject() - как этого можно добиться?

П.С. Ведь в jQuery подобное поведение как-то реализовано...

Rootpassword 29.02.2012 16:23

apply / call

SuperDennis 29.02.2012 16:36

Уже нашел такие чудесные изобретения человечества, как .call() и .apply(), все сделал, все работает. Но всё-равно спасибо!

SuperDennis 29.02.2012 16:37

Кстати, если кому вдруг станет полезно или просто интересно, вот код:

// jQuery .on() analog
Map.prototype.on = function (event, handler) {
	var $this = this;
	this.map.on(event, function (e) {
		handler.call($this, e);
	});
};

nikita.mmf 29.02.2012 16:41

// jQuery .on() analog
Map.prototype.on = function (event, handler) {
	this.map.on(event, $.proxy( handler, this) );
};


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