Пытаюсь создать оболочку для методов jQuery

#javascript #methods #prototype #wrapper

#javascript #методы #прототип #оболочка

Вопрос:

Я хочу создать оболочку для каждого метода в 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 не является функцией»

Также пытался (согласно комментарию Барни) создать замыкание следующим образом:

 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. вы могли бы попробовать войти в систему, o.prototype[m] а также m посмотреть, какой тип addClass есть. Может быть, это не тип функции, а что-то другое, что вам нужно учитывать?

Ответ №1:

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

Комментарии:

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