#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. Спасибо Барни. Я подозревал что-то подобное, поэтому мне нужно создать вложение?