Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 28.09.2012, 18:34
Интересующийся
Отправить личное сообщение для gh321 Посмотреть профиль Найти все сообщения от gh321
 
Регистрация: 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;
Так что ли?
Ответить с цитированием
  #2 (permalink)  
Старый 28.09.2012, 19:00
х.з
Посмотреть профиль Найти все сообщения от dmitriymar
 
Регистрация: 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
Ответить с цитированием
  #3 (permalink)  
Старый 28.09.2012, 23:58
Особый гость
Посмотреть профиль Найти все сообщения от monolithed
 
Регистрация: 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);
Ответить с цитированием
  #4 (permalink)  
Старый 29.09.2012, 04:43
Аватар для FINoM
Новичок
Отправить личное сообщение для FINoM Посмотреть профиль Найти все сообщения от FINoM
 
Регистрация: 05.09.2010
Сообщений: 2,298

Задам, возможно, идиотский вопрос: можно ли изменить функцию после её инициализации, не инициализируя новую?
Например:
Function.prototype.alertAfterCall = function() {
   // ???
}
function a() {}
a.alertAfterCall();
a(); // срабатывает алерт
__________________
"Matreshka is fucking awesome" © чувак с Reddit
Matreshka.js - Три возможности
Ответить с цитированием
  #5 (permalink)  
Старый 30.09.2012, 01:49
Особый гость
Посмотреть профиль Найти все сообщения от monolithed
 
Регистрация: 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.
Ответить с цитированием
  #6 (permalink)  
Старый 30.09.2012, 03:05
Аватар для FINoM
Новичок
Отправить личное сообщение для FINoM Посмотреть профиль Найти все сообщения от FINoM
 
Регистрация: 05.09.2010
Сообщений: 2,298

Сообщение от monolithed
Или я чего-то не понял?
Произвольную функцию.
__________________
"Matreshka is fucking awesome" © чувак с Reddit
Matreshka.js - Три возможности
Ответить с цитированием
  #7 (permalink)  
Старый 30.09.2012, 03:15
Особый гость
Посмотреть профиль Найти все сообщения от monolithed
 
Регистрация: 02.04.2010
Сообщений: 4,260

Сообщение от FINoM
Произвольную функцию.
Вопрос странный, если ты не знаешь что где эта функция определена и что она делает, зачем ее модифицировать?
Ну перезапиши ее если не нравится, в чем проблема?
Ответить с цитированием
  #8 (permalink)  
Старый 30.09.2012, 03:23
Особый гость
Посмотреть профиль Найти все сообщения от monolithed
 
Регистрация: 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.
Ответить с цитированием
  #9 (permalink)  
Старый 30.09.2012, 03:39
Аватар для FINoM
Новичок
Отправить личное сообщение для FINoM Посмотреть профиль Найти все сообщения от FINoM
 
Регистрация: 05.09.2010
Сообщений: 2,298

Сообщение от monolithed
Оно?
Сообщение от FINoM
можно ли изменить функцию после её инициализации, не инициализируя новую
Нет не оно. О переопределении и я знаю.
__________________
"Matreshka is fucking awesome" © чувак с Reddit
Matreshka.js - Три возможности
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Задача такова : нужно при клике на ссылку открыть страницу с новой вкладке, оставаясь asustekk Javascript под браузер 4 25.05.2012 14:04
задача "Пересечение сторон фигуры линией в одной точке" lh2030 Общие вопросы Javascript 9 11.03.2011 20:03
помощь новичку - задача вывода содержимого нескольких страниц в одну новую samurau AJAX и COMET 2 03.11.2009 19:07