Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   user.js - переопределить функцию (https://javascript.ru/forum/misc/64448-user-js-pereopredelit-funkciyu.html)

TestUser013 11.08.2016 21:00

user.js - переопределить функцию
 
Доброго времени суток.
Пишу для себя небольшой user.js и возникла необходимость изменить поведение одной из функций на сайте.

Функция "вложеная" и конструкция выглядит следующим образом:
Код:

function vB_Inline_Mod(A, B, C, D) {
    this.varname = A;
    this.check_all = function (J, G, H) {
        var G;
        if (this.varname == 'AAA') {
            G = 'GGG';
        }
    }
}

Мне нужно изменить поведение функции check_all (фактически добавить в нее еще одну строчку кода). Какие есть для этого способы? Как это правильно сделать?

рони 11.08.2016 21:23

TestUser013,
vB_Inline_Mod замените на нужную вам функцию

TestUser013 11.08.2016 21:27

Я правильно понял? Скопировать целую vB_Inline_Mod и добавить в нее одну строчку? Она относительно большая... У меня скрипт на 100 строчек, а эта функция на 500. Неужели нет способа изменить только check_all?

рони 11.08.2016 22:04

TestUser013,
да правильно ... возможно есть иной способ

Яростный Меч 11.08.2016 23:56

можно попробовать так:

var old_vB_Inline_Mod = vB_Inline_Mod;

vB_Inline_Mod = function(A, B, C, D) {
    var r = old_vB_Inline_Mod.apply(this, arguments);

    var old_check_all = this.check_all;
    this.check_all = function (J, G, H) {
        var r = old_check_all.apply(this, arguments);
        // вот прямо сюда добавляем свою строчку кода
        return r;
    };

    return r;
};

warren buffet 12.08.2016 01:11

ТС, тебе просто повезло, что есть функция с именем. Имени может и не быть.

Vlasenko Fedor 12.08.2016 02:20

vB_Inline_Mod.check_all = myFunction;
:)

warren buffet 12.08.2016 05:19

Poznakomlus, хороший прикол, типа "мама роди меня взад". Да и профессор Яростный Меч мог не угадать. Если в функции есть this, то без конструирования this снаружи - undefined, а конструирование к тому моменту, когда user.js полезет заменять что-то, может быть уже завершено. Да и вообще это сугубо частный случай. Решение более общего порядка - найти эти самые вызовы и запускать их самому со своими параметрами и под своим контекстом.

То есть найти куда втыкается vB_Inline_Mod и где воткнутое вызывается, подготовить для вызова все переменные и вызывать самому ПОСЛЕ.

PS Быстрый поиск показал, что оно на самом деле конструируется, inlineMod = new vB_Inline_Mod('inlineMod', 'post',... то есть надо найти готовый объект и в нем уже можно будет заменить метод.

TestUser013 12.08.2016 10:51

Спасибо огромное за помощь :)
Я добился приемлемого результата. Сначала переопределил всю функцию и сработало. Но после последнего поста переделал - циклом пробегаюсь по всем вызовам функции и заменяю ее на свою.

Не пробовал варианта с поста #5, но возьму на заметку, возможно пригодится в будущем.

Спасибо :)


Часовой пояс GMT +3, время: 07:48.