У нас есть толстое клиентское приложение, активно использующее jQuery, и мы хотим профилировать производительность кода с помощью API firebug console.profile. Проблема в том, что я не хочу менять код для написания операторов профиля. Вот пример:
var search=function(){ this.init=function(){ console.log('init'); } this.ajax=function(){ console.log('ajax'); //make ajax call using $.ajax and do some DOM manipulations here.. } this.cache=function(){ console.log('cache'); } } var instance=new search(); instance.ajax();
Я хочу профилировать свой метод instance.ajax, но я не хочу добавлять в код операторы профиля, так как это затрудняет поддержку кода.
Я пытаюсь переопределить методы с помощью замыканий, например: http://www.novogeek.com/post/2010/02/27/Overriding-jQueryJavaScript-functions-using-closures.aspx, но я не очень уверен, как я могу этого добиться. Есть указатели на это? Я думаю, что это поможет многим крупным проектам легко профилировать код без серьезных изменений в коде.
Вот идея. Просто запустите приведенный ниже код в консоли firebug, чтобы узнать, чего я пытаюсь достичь.
var search=function(){ this.init=function(){ console.log('init'); } this.ajax=function(){ console.log('ajax'); //make ajax call using $.ajax and do some DOM manipulations here.. } this.cache=function(){ console.log('cache'); } } var instance=new search(); $.each(instance, function(functionName, functionBody){ (function(){ var dup=functionBody functionBody=function(){ console.log('modifying the old function: ',functionName); console.profile(functionName); dup.apply(this,arguments); console.profileEnd(functionName); } })(); console.log(functionName, '::', functionBody()); });
Теперь мне нужно, если я скажу instance.ajax (), я хочу, чтобы был вызван новый метод ajax () вместе с операторами console.profile. Надеюсь, я понимаю требование. Пожалуйста, импровизируйте приведенный выше код.
С Уважением, Кришна, http://www.novogeek.com
2 ответа
Если вы хотите изменить только один экземпляр "search", это должно сработать:
$.each(instance, function(name, method){
if (typeof method !== 'function') return;
instance[name] = function() {
console.profile(name);
var ret = method.apply(this, arguments);
console.profileEnd(name);
return ret;
};
});
Я знаю, что это было очень давно, но я хотел добавить это на случай, если другие люди найдут этот ответ. Вы можете заставить работать анонимные / частные функции, добавив имя каждой из них. В других комментариях упоминается, что это делается вручную, я хотел объяснить, как:
$('.stuff').each(function() { ... });
К
$('.stuff').each(function workOnStuff() { ... });
Похожие вопросы
Новые вопросы
javascript
По вопросам программирования на ECMAScript (JavaScript / JS) и его различных диалектах / реализациях (кроме ActionScript). Включите все соответствующие теги в свой вопрос; например, [node.js], [jquery], [json] и т. д.