У нас есть толстое клиентское приложение, активно использующее 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
novogeek 30 Май 2010 в 22:00

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;
    };
});
2
James 30 Май 2010 в 18:25

Я знаю, что это было очень давно, но я хотел добавить это на случай, если другие люди найдут этот ответ. Вы можете заставить работать анонимные / частные функции, добавив имя каждой из них. В других комментариях упоминается, что это делается вручную, я хотел объяснить, как:

$('.stuff').each(function() { ... });

К

$('.stuff').each(function workOnStuff() { ... });

0
TC0072 21 Янв 2017 в 13:44