Открыть меню    

Декоратор или функция обертка в javascript

Декоратор позволяет модифицировать поведение функции.

Декоратор – обертка, которая модифицирует поведение функции.

js

var weekdays = ["понедельник","вторник","среда","четверг","пятница","суббота","воскресенье"];

function getDay(num)
{
    return weekdays[num];
}

for(var i=0; i<7; i++)
{
    console.log(getDay(i));
}

Допустим нам надо не просто выводить день недели, а день недели обернутый в тег span.

Можно воспользоваться дополнительной функцией, например (getDaySpan):

js

function getDaySpan(num)
{
    return "<span>"+weekdays[num]+"</span>";
}

for(var i=0; i<7; i++)
{
    console.log(getDaySpan(i));
}

А что, если нам понадобится обернуть день недели в тег b или в любой другой тег. Конечно, можно использовать шаблоны. Но мы пока используем дополнительные функции.

Создание однотипных функций можно решить универсально: для этого и используется декоратор.

jQuery

// пример декоратора
function wrapDecorator(f, startTag, closeTag)
{
    return function(num) // возвращаем обертку
    {
        return startTag + f(num) + closeTag;
    }
}

// универсальные декорар
function wrapDecorator(f, startTag, closeTag)
{
    return function(num) // возвращаем обертку
    {
        return startTag + f.apply(this,arguments) + closeTag;
    }
}
// /view_snippets.php?id=35     Методы javascript call и apply


// Использование декоратора

var getDayInDiv = wrapDecorator(getDay,"<div>","</div>");
var getDayInSpan = wrapDecorator(getDay,"<span>","</span>");


for(var i=0; i<7; i++)
{
    console.log(getDayInDiv(i));
}


for(var i=0; i<7; i++)
{
    console.log(getDayInSpan(i));
}


// результат
/*
<div>понедельник</div>
<div>вторник</div>
<div>среда</div>
<div>четверг</div>
<div>пятница</div>
<div>суббота</div>
<div>воскресенье</div>
<span>понедельник</span>
<span>вторник</span>
<span>среда</span>
<span>четверг</span>
<span>пятница</span>
<span>суббота</span>
<span>воскресенье</span>
*/

Декоратор – это функция, она получает в качестве параметров другую функцию и другие параметры.

Задача декоратора вернуть обертку вокруг функции (f):

js

 //decorator(f,…..)

Смысл обертки: модифицировать ф-ю f, причем вызов функции, как правило, остается неизменным.



Весь код

js


var weekdays = ["понедельник","вторник","среда","четверг","пятница","суббота","воскресенье"];

function getDay(num)
{
    return weekdays[num];
}

for(var i=0; i<7; i++)
{
    console.log(getDay(i));
}


function getDaySpan(num)
{
    return "<span>"+weekdays[num]+"</span>";
}

for(var i=0; i<7; i++)
{
    console.log(getDaySpan(i));
}

// пример декоратора
function wrapDecorator(f, startTag, closeTag)
{
    return function(num) // возвращаем обертку
    {
        return startTag + f(num) + closeTag;
    }
}

// универсальные декорар
function wrapDecorator(f, startTag, closeTag)
{
    return function(num) // возвращаем обертку
    {
        return startTag + f.apply(this,arguments) + closeTag;
    }
}
// /view_snippets.php?id=35     Методы javascript call и apply


// Использование декоратора

var getDayInDiv = wrapDecorator(getDay,"<div>","</div>");
var getDayInSpan = wrapDecorator(getDay,"<span>","</span>");


for(var i=0; i<7; i++)
{
    console.log(getDayInDiv(i));
}


for(var i=0; i<7; i++)
{
    console.log(getDayInSpan(i));
}


// результат
/*
<div>понедельник</div>
<div>вторник</div>
<div>среда</div>
<div>четверг</div>
<div>пятница</div>
<div>суббота</div>
<div>воскресенье</div>
<span>понедельник</span>
<span>вторник</span>
<span>среда</span>
<span>четверг</span>
<span>пятница</span>
<span>суббота</span>
<span>воскресенье</span>
*/

Комментарии к статье

аватарка пользователя
2014-07-16
Sancher

Большое спасибо! Всё понятно

аватарка пользователя
2014-07-16
Sancher

Большое спасибо! Всё понятно

аватарка пользователя
2014-07-16
Sancher

Большое спасибо! Всё понятно

аватарка пользователя
2015-01-28
Viktor Soroka

Мне кажется что не стоит путать пользователей сообщая, что в статье используется jQuery - так как в коде он не использовался - а в целом спасибо за статью.

Добавить комментарий к сниппету

  • Сервис онлайн-записи на собственном Telegram-боте
    Тот, кто работает в сфере услуг, знает — без ведения записи клиентов никуда. Мало того, что нужно видеть свое расписание, но и напоминать клиентам о визитах тоже. Нашли самый бюджетный и оптимальный вариант: сервис VisitTime.
    Для новых пользователей первый месяц бесплатно.
    Чат-бот для мастеров и специалистов, который упрощает ведение записей:
    Сам записывает клиентов и напоминает им о визите;
    Персонализирует скидки, чаевые, кэшбэк и предоплаты;
    Увеличивает доходимость и помогает больше зарабатывать;
    Начать пользоваться сервисом
  • Как продвинуть сайт на первые места?
    Вы создали или только планируете создать свой сайт, но не знаете, как продвигать? Продвижение сайта – это не просто процесс, а целый комплекс мероприятий, направленных на увеличение его посещаемости и повышение его позиций в поисковых системах.
    Ускорение продвижения
    Если вам трудно попасть на первые места в поиске самостоятельно, попробуйте технологию Буст, она ускоряет продвижение в десятки раз, а первые результаты появляются уже в течение первых 7 дней. Если ни один запрос у вас не продвинется в Топ10 за месяц, то в SeoHammer за бустер вернут деньги.
    Начать продвижение сайта