28.09.2012, 18:34
|
Интересующийся
|
|
Регистрация: 14.02.2011
Сообщений: 23
|
|
Задача на декоратор
Привет.
Есть такая задача и решение
Код:
|
//Создайте декоратор makeLogging(f, log), который берет функцию f и //массив log.
//Он должен возвращать обёртку вокруг f, которая при каждом вызове //записывает («логирует») аргументы в log, а затем передает вызов в f.
//В этой задаче можно считать, что функции f ровно один аргумент.
//Работать должно так:
function work(a) {
/* ... */ // work - произвольная функция, один аргумент
}
function makeLogging(f, log) { /* ваш код */ }
var log = [];
work = makeLogging(work, log);
work(1); // 1, добавлено в log
work(5); // 5, добавлено в log
for(var i=0; i<log.length; i++) {
*!*
alert( 'Лог:' + log[i] ); // "Лог:1", затем "Лог:5"
*/!*
} |
Решение
Код:
|
function makeLogging(f, log) {
function wrapper(a) {
log.push(a);
return f.call(this, a);
}
return wrapper;
} |
Нашел другое решение, но не ясно толком, как оно работает
Код:
|
function makeLogging(f,log)
{
return function(){
log.push(arguments[0]);
return f.call(this,arguments[0]);
}
} |
arguments здесь относиться к f - то есть arguments[0] равен принимаемому f параметру
work(1); - arguments[0]=1;
Так что ли?
|
|
28.09.2012, 19:00
|
х.з
|
|
Регистрация: 21.11.2010
Сообщений: 4,588
|
|
Сообщение от gh321
|
arguments здесь относиться к f - то есть arguments[0] равен принимаемому f параметру
work(1); - arguments[0]=1;
Так что ли?
|
с чего это ? return function(){ -это не функция чтоль?
http://javascript.ru/basic/functions...lom-parametrov
|
|
28.09.2012, 23:58
|
Особый гость
|
|
Регистрация: 02.04.2010
Сообщений: 4,260
|
|
все же проще простого:
var log = [];
var decorate = function(callback, log) {
return function(param) {
callback(log.push(param));
}
};
var callback = function(log) {
alert(log);
};
decorate = decorate(callback, log);
decorate(1);
decorate(2);
alert(log);
|
|
29.09.2012, 04:43
|
|
Новичок
|
|
Регистрация: 05.09.2010
Сообщений: 2,298
|
|
Задам, возможно, идиотский вопрос: можно ли изменить функцию после её инициализации, не инициализируя новую?
Например:
Function.prototype.alertAfterCall = function() {
// ???
}
function a() {}
a.alertAfterCall();
a(); // срабатывает алерт
|
|
30.09.2012, 01:49
|
Особый гость
|
|
Регистрация: 02.04.2010
Сообщений: 4,260
|
|
Сообщение от FINoM
|
можно ли изменить функцию после её инициализации, не инициализируя новую
|
var a = function() {
alert(1);
};
var foo = function() {
return a();
};
foo();
a = function() {
alert(2);
};
foo();
Или так:
var foo = function(callback) {
callback();
};
foo(function() {
alert(1);
});
foo(function() {
alert(2);
});
Или так:
var foo = function()
{
if (!(this instanceof foo))
return new foo;
if (this.get)
{
this.get();
this.get = null;
}
else alert(1);
};
foo();
foo.prototype.get = function() {
alert(2);
};
foo();
Или я чего-то не понял?
Последний раз редактировалось monolithed, 30.09.2012 в 02:10.
|
|
30.09.2012, 03:05
|
|
Новичок
|
|
Регистрация: 05.09.2010
Сообщений: 2,298
|
|
Сообщение от monolithed
|
Или я чего-то не понял?
|
Произвольную функцию.
|
|
30.09.2012, 03:15
|
Особый гость
|
|
Регистрация: 02.04.2010
Сообщений: 4,260
|
|
Сообщение от FINoM
|
Произвольную функцию.
|
Вопрос странный, если ты не знаешь что где эта функция определена и что она делает, зачем ее модифицировать?
Ну перезапиши ее если не нравится, в чем проблема?
|
|
30.09.2012, 03:23
|
Особый гость
|
|
Регистрация: 02.04.2010
Сообщений: 4,260
|
|
Function.prototype.modify = function(callback)
{
var __this__ = this;
return function() {
__this__();
callback.apply(__this__, arguments);
};
};
var foo = function() {
alert(1);
}
.modify(function() {
alert(2);
});
foo();
Оно?
Последний раз редактировалось monolithed, 30.09.2012 в 03:26.
|
|
30.09.2012, 03:39
|
|
Новичок
|
|
Регистрация: 05.09.2010
Сообщений: 2,298
|
|
Сообщение от monolithed
|
Оно?
|
Сообщение от FINoM
|
можно ли изменить функцию после её инициализации, не инициализируя новую
|
Нет не оно. О переопределении и я знаю.
|
|
|
|