JavaScript декораторы HOWTO? - PullRequest
       29

JavaScript декораторы HOWTO?

5 голосов
/ 04 декабря 2009

Мне нужно украсить стороннюю функцию, которую я не могу изменить, поэтому мне нужно будет украсить ее любым способом. Я обнаружил, что в Prototype есть что-то, что делает это легко [1].

Есть ли альтернатива этому в jQuery или в простом JavaScript?

[1] http://api.prototypejs.org/language/Function/prototype/wrap/

Ответы [ 5 ]

4 голосов
/ 04 декабря 2009

Что по вашему сценарию требует библиотеки? Кажется, что с нативным JavaScript, вы могли бы просто:

  • Сохранить копию оригинальной функции
  • Создать модифицированную версию функции, которая использует оригинал
  • Хранить ссылку на измененную версию, в которой оригинал был сохранен.
1 голос
/ 04 декабря 2009

С 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();" />

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

0 голосов
/ 27 февраля 2010

Вы можете сделать это с помощью плагина 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 голосов
/ 04 декабря 2009

Я пойду за Фрэнк Швитерман решение:

new_func = originalFunc
function myExtendedVersion()
{ 
  // do my stuff
  new_func();
  // do my stuff 
} 
0 голосов
/ 04 декабря 2009

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

myFunction(){
   something();
   thirdParty.call();  // or apply
   perhapsSomethingElse();
}
...