Javascript-форум (https://javascript.ru/forum/)
-   Ваши сайты и скрипты (https://javascript.ru/forum/project/)
-   -   Событие вызова функции (https://javascript.ru/forum/project/24101-sobytie-vyzova-funkcii.html)

FINoM 17.12.2011 23:45

Событие вызова функции
 
Чисто из интереса, решил узнать, можно ли повесить событие на вызов функции. Как ни странно (для меня), это удалось.

(function(){
	window.callEvent = function(func, callback){
		var callNumber = 0;
		return function(){
			var args = [].slice.call(arguments);
			var result;
			try {
				result = func.apply(this, arguments);
				callNumber++;
			} catch (e) {
				callback(e, args, this, callNumber);
				throw e;
			}
			callback(result, args, this, callNumber);
			return result;				 
		}
	}
	
	var logSomething = function(something){
		console.log(something);
	}
	
	logSomething = callEvent(logSomething, function(result, args, self, callNumber){
		console.log('alertSomething has been called. \n\
			Result is ' + result + '. \n\
			Arguments are ' + args + '. \n\
			Self is ' + self + '. \n\
			Number of calls ' + callNumber + '. \n'
		);
	});
	
	Array.prototype.push = callEvent(Array.prototype.push, function(result, args, self, callNumber){
		console.log('Array.prototype.push has been called. \n\
			Result is ' + result + '. \n\
			Arguments are ' + args + '. \n\
			Self is ' + self);
	});
	
	logSomething('Fuck yeah!');
	logSomething('Fuck yeah!');
	logSomething('Fuck yeah!');
	logSomething('Fuck yeah!');
	logSomething('Fuck yeah!');
	
	var array = [1,2,3,4,5];
	array.push(6);
})();

B@rmaley.e><e 17.12.2011 23:49

Цитата:

Сообщение от FINoM
var func2 = func;

Ненужная строка. И простого func хватит.

FINoM 17.12.2011 23:51

B@rmaley.e><e, точно, спасибо.

FINoM 18.12.2011 00:44

Только вот не могу придумать, как это сделать через Function.prototype.

Gvozd 18.12.2011 01:21

а ну-ка, выкинь исключение в наблюдаемой функции))))

FINoM 18.12.2011 01:31

Не совсем понимаю о чем ты. Кинул исключение, всё остановилось. И что?

trikadin 18.12.2011 01:44

Цитата:

Сообщение от FINoM
Только вот не могу придумать, как это сделать через Function.prototype.

Переопределить?

FINoM 18.12.2011 01:49

Цитата:

Сообщение от trikadin
Переопределить?

Э, как?
Function.prototype.callEvent = function(callback){
	this = function(){...
Выкидывает исключение.

B@rmaley.e><e 18.12.2011 01:54

Цитата:

Сообщение от FINoM
Выкидывает исключение.

Естественно. Изменить this из метода нельзя. В данном случае можно будет только вернуть новую функцию, для которой будет назначен соответствующий обработчик.

trikadin 18.12.2011 02:03

Цитата:

Сообщение от B@rmaley.e><e
Естественно. Изменить this из метода нельзя. В данном случае можно будет только вернуть новую функцию, для которой будет назначен соответствующий обработчик.

Я говорю о том, чтобы при создании ф-ции добавлять к ней коллбек и способ добавления новых коллбеков. Путем сохранения Function в переменную и переопределения его. Вряд ли это реально, но это просто идея.


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