试图为jQuery方法创建一个包装器

时间:2016-10-21 09:09:30

标签: javascript methods prototype wrapper

我希望为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

谢谢

1 个答案:

答案 0 :(得分:0)

您遇到变量 _temp 的问题。您可以在函数 wrapClass 的范围内创建此变量,因此您可以在每次循环迭代中覆盖它。最后你总是有最后一个jQuery方法(可能是undelegate) 我没有对整个案例进行分析,但在循环之后你总是调用最后一个方法,不管你调用什么jQuery函数。