Переопределение JavaScript функционирует при ссылке на оригинал

155
задан John Slegers 17 January 2016 в 22:56
поделиться

4 ответа

Вы могли сделать что-то вроде этого:

var a = (function() {
    var original_a = a;

    if (condition) {
        return function() {
            new_code();
            original_a();
        }
    } else {
        return function() {
            original_a();
            other_new_code();
        }
    }
})();

Объявление original_a внутренняя часть анонимная функция мешает ему создавать помехи глобальному пространству имен, но это доступно во внутренних функциях.

Как Nerdmaster, упомянутый в комментариях, убедиться включать () в конец. Вы хотите вызвать внешнюю функцию и сохранить результат (одна из двух внутренних функций) в a, не сохранить саму внешнюю функцию в a.

177
ответ дан Viccari 23 November 2019 в 21:55
поделиться

Шаблон "proxy" мог бы помочь Вам:

(function() {
    // log all calls to setArray
    var proxied = jQuery.fn.setArray;
    jQuery.fn.setArray = function() {
        console.log( this, arguments );
        return proxied.apply( this, arguments );
    };
})();

вышеупомянутые обертки его код в функции для сокрытия "проксированного" - переменная. Это сохраняет setArray-метод jQuery в закрытии и перезаписывает его. Прокси тогда регистрирует все вызовы к методу и делегирует вызов к оригиналу. Используя применяются (это, аргументы) гарантирует, что вызывающая сторона не будет в состоянии заметить различие между оригиналом и проксированным методом.

84
ответ дан John Slegers 23 November 2019 в 21:55
поделиться

Спасибо, ребята, шаблон прокси действительно помог ..... На самом деле я хотел вызвать глобальную функцию foo .. На определенных страницах мне нужно сделать несколько проверок. Я сделал следующее.

//Saving the original func
var org_foo = window.foo;

//Assigning proxy fucnc
window.foo = function(args){
    //Performing checks
    if(checkCondition(args)){
        //Calling original funcs
        org_foo(args);
    }
};

Спасибо, это действительно помогло мне

27
ответ дан 23 November 2019 в 21:55
поделиться

Переопределить функцию можно, используя конструкцию типа:

function override(f, g) {
    return function() {
        return g(f);
    };
}

Например:

 a = override(a, function(original_a) {
      if (condition) { new_code(); original_a(); }
      else { original_a(); other_new_code(); }
 });

Правка: Исправлена опечатка.

10
ответ дан 23 November 2019 в 21:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: