Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Задача на декоратор (https://javascript.ru/forum/misc/31996-zadacha-na-dekorator.html)

gh321 28.09.2012 18:34

Задача на декоратор
 
Привет.
Есть такая задача и решение
Код:

//Создайте декоратор 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;
Так что ли?

dmitriymar 28.09.2012 19:00

Цитата:

Сообщение от gh321
arguments здесь относиться к f - то есть arguments[0] равен принимаемому f параметру
work(1); - arguments[0]=1;
Так что ли?

с чего это ? return function(){ -это не функция чтоль?

http://javascript.ru/basic/functions...lom-parametrov

monolithed 28.09.2012 23:58

все же проще простого:

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);

FINoM 29.09.2012 04:43

Задам, возможно, идиотский вопрос: можно ли изменить функцию после её инициализации, не инициализируя новую?
Например:
Function.prototype.alertAfterCall = function() {
   // ???
}
function a() {}
a.alertAfterCall();
a(); // срабатывает алерт

monolithed 30.09.2012 01:49

Цитата:

Сообщение от 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();


Или я чего-то не понял?

FINoM 30.09.2012 03:05

Цитата:

Сообщение от monolithed
Или я чего-то не понял?

Произвольную функцию.

monolithed 30.09.2012 03:15

Цитата:

Сообщение от FINoM
Произвольную функцию.

Вопрос странный, если ты не знаешь что где эта функция определена и что она делает, зачем ее модифицировать?
Ну перезапиши ее если не нравится, в чем проблема?

monolithed 30.09.2012 03:23

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();


Оно?

FINoM 30.09.2012 03:39

Цитата:

Сообщение от monolithed
Оно?

Цитата:

Сообщение от FINoM
можно ли изменить функцию после её инициализации, не инициализируя новую

Нет не оно. О переопределении и я знаю.


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