ПРАКТИЧЕСКОЕ РУКОВОДСТВО декораторов JavaScript?

TDD требует определенной организации по Вашему коду. Это могло бы быть неэффективно или трудно читать. Или даже архитектурно неправильно; например, с тех пор private методы нельзя назвать вне класса, необходимо сделать методы нечастными для создания их тестируемыми, который является просто неправильным.

, Когда код изменяется, необходимо изменить тесты также. С рефакторингом этого может быть большая дополнительная работа.

5
задан reevesy 15 March 2012 в 04:25
поделиться

5 ответов

А что насчет вашего сценария требует библиотеки? Похоже, что с собственным javascript вы могли бы просто:

  • Сохранить копию исходной функции
  • Создать измененную версию функции, которая использует исходную
  • Сохранить ссылку на измененную версию, где изначально был оригинал сохранено.
4
ответ дан 15 December 2019 в 01:03
поделиться

С jquery было бы довольно легко просто добавить другую функцию для использования. Попробуйте что-то вроде:

//Sample function you're wrapping around 
function say_hi(){
    alert('hi');
}

//quick jq plugin
jQuery.fn.functionWrap = function(arg,opts){
    if(opts.before && typeof(opts.before)=='function'){
        opts.before();
    }
    arg();
    if(opts.after && typeof(opts.after)=='function'){
        opts.after();
    }
};


//sample function to use the wrapper func
function btnPress(){
    $().functionWrap(
        say_hi,
        {
            before : function(){ alert('happens before'); }, 
            after : function(){ alert('happens after'); } 
        }
    );
}

Попробуйте добавить это на свою страницу и что-нибудь вроде этого, чтобы проверить это:

<input type="button" value="asdf" onClick="btnPress();" />

Надеюсь, это вам поможет.

1
ответ дан 15 December 2019 в 01:03
поделиться

Мне нравятся функции переноса, предоставляемые библиотеками: в Prototype есть функция переноса. В ExtJS можно использовать createDelegate или createInterceptor. В Dojo есть декларативный АОП. Без фреймворка можно было бы сделать следующее:

myFunction(){
   something();
   thirdParty.call();  // or apply
   perhapsSomethingElse();
}
0
ответ дан 15 December 2019 в 01:03
поделиться

Я воспользуюсь решением Фрэнка Швитермана :

new_func = originalFunc
function myExtendedVersion()
{ 
  // do my stuff
  new_func();
  // do my stuff 
} 
-1
ответ дан 15 December 2019 в 01:03
поделиться

Вы можете сделать это с помощью плагина jquery AOP: http://code.google.com/p/jquery-aop/

Код будет выглядеть так:

jQuery.aop.around( {target: window, method: 'originalFunc'}, 
  function(invocation) {
    // do your stuff
    invocation.proceed(); 
    // do your stuff
  }
);
0
ответ дан 15 December 2019 в 01:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: