2016-10-21 4 views
0

Я хочу создать оболочку для каждого метода в jQuery, который будет, например, выводить console.log каждый раз при вызове метода. Не уверен, что мне не хватает.Попытка создать оболочку для методов jQuery

работы с обертыванием один метод (addClass) так:

_addClass=jQuery.prototype.addClass; 
jQuery.prototype.addClass = function() { 
    var args = [].slice.call(arguments, 0); 
    console.log('addClass arguments',args); 
    return _addClass.apply(this, args); 
}; 
$('body').addClass('blue') 

который работал очень хорошо для меня. Далее я пытаюсь перебрать все методы JQuery, которые у меня возникли трудности с:

function wrapClass (o) 
{ 
    for (var m in o.prototype) 
    { 
     if (typeof(o.prototype[m]) === "function") 
     { 
      console.log('wrapping ',m); 
      var _temp=o.prototype[m]; 
      o.prototype[m] = function() { 
       var args = [].slice.call(arguments, 0); 
       console.log(m+' arguments',args); 
       return _temp.apply(this, args); 
      }; 
     } 
    } 
}; 
wrapClass(jQuery); 

Это производит TypeError «this.off не является функцией»

пытался также (за Barni-х комментарии), чтобы создать укупорочное так:

function wrapClass (o) 
{ 
    for (var m in o.prototype) 
    { 
     if (typeof(o.prototype[m]) === "function") 
     { 
      (function(){ 
       var _temp=o.prototype[m]; 
       console.log('wrapping ',m,typeof(_temp)); 
         o.prototype[m] = function() { 
         var args = [].slice.call(arguments, 0); 
         console.log(m+' arguments',args); 
         return _temp.apply(this, args); 
       }; 
      })(m); 
     } 
    } 
}; 
wrapClass(jQuery); 
$('body').addClass('blue'); 

Но теперь я получаю следующий вывод и ошибка:

undelegate arguments ["body", undefined] 
undelegate arguments ["body"] 
undelegate arguments [Array[0]] 
undelegate arguments [] 
undelegate arguments [undefined, undefined] 
Uncaught TypeError: $(...).addClass is not a function 

Спасибо

+0

вы можете попытаться записать 'o.prototype [m]', а также 'm', чтобы узнать, какой тип' addClass'. Может быть, это не тип функции, а что-то еще, что вам нужно учитывать? – John

ответ

0

У вас есть проблемы с переменной _temp. Вы создаете эту переменную в области функции wrapClass, поэтому вы перезаписываете ее в каждой итерации цикла. В конце у вас всегда есть последний метод jQuery (вероятно, это undelegate).
Я не анализировал весь случай, но после вашего цикла вы всегда вызываете последний метод, не считаете, какую функцию jQuery вы вызываете.

+0

Спасибо, Барни. Я подозревал что-то вроде этого, поэтому мне нужно создать приложение? –

+0

Я попытался расследовать это. –