2016-10-21 54 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); 

這將產生一個類型錯誤 「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

感謝Barni。我懷疑這樣的事情,所以我需要創建一個外殼? –

+0

我試圖調查它。 –