我希望为jQuery中的每个方法创建一个包装器,例如每次调用该方法时都会输出一个console.log。 不确定我错过了什么。
开始包装单个方法(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 :(得分:0)
您遇到变量 _temp 的问题。您可以在函数 wrapClass 的范围内创建此变量,因此您可以在每次循环迭代中覆盖它。最后你总是有最后一个jQuery方法(可能是undelegate) 我没有对整个案例进行分析,但在循环之后你总是调用最后一个方法,不管你调用什么jQuery函数。