Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 11.08.2016, 21:00
Аспирант
Отправить личное сообщение для TestUser013 Посмотреть профиль Найти все сообщения от TestUser013
 
Регистрация: 13.07.2013
Сообщений: 94

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 (фактически добавить в нее еще одну строчку кода). Какие есть для этого способы? Как это правильно сделать?
Ответить с цитированием
  #2 (permalink)  
Старый 11.08.2016, 21:23
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,124

TestUser013,
vB_Inline_Mod замените на нужную вам функцию
Ответить с цитированием
  #3 (permalink)  
Старый 11.08.2016, 21:27
Аспирант
Отправить личное сообщение для TestUser013 Посмотреть профиль Найти все сообщения от TestUser013
 
Регистрация: 13.07.2013
Сообщений: 94

Я правильно понял? Скопировать целую vB_Inline_Mod и добавить в нее одну строчку? Она относительно большая... У меня скрипт на 100 строчек, а эта функция на 500. Неужели нет способа изменить только check_all?
Ответить с цитированием
  #4 (permalink)  
Старый 11.08.2016, 22:04
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,124

TestUser013,
да правильно ... возможно есть иной способ
Ответить с цитированием
  #5 (permalink)  
Старый 11.08.2016, 23:56
Профессор
Отправить личное сообщение для Яростный Меч Посмотреть профиль Найти все сообщения от Яростный Меч
 
Регистрация: 12.04.2010
Сообщений: 557

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

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;
};
Ответить с цитированием
  #6 (permalink)  
Старый 12.08.2016, 01:11
Профессор
Отправить личное сообщение для warren buffet Посмотреть профиль Найти все сообщения от warren buffet
 
Регистрация: 08.07.2016
Сообщений: 1,332

ТС, тебе просто повезло, что есть функция с именем. Имени может и не быть.
Ответить с цитированием
  #7 (permalink)  
Старый 12.08.2016, 02:20
Аватар для Vlasenko Fedor
Профессор
Отправить личное сообщение для Vlasenko Fedor Посмотреть профиль Найти все сообщения от Vlasenko Fedor
 
Регистрация: 13.03.2013
Сообщений: 1,572

vB_Inline_Mod.check_all = myFunction;
Ответить с цитированием
  #8 (permalink)  
Старый 12.08.2016, 05:19
Профессор
Отправить личное сообщение для warren buffet Посмотреть профиль Найти все сообщения от warren buffet
 
Регистрация: 08.07.2016
Сообщений: 1,332

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

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

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

Последний раз редактировалось warren buffet, 12.08.2016 в 05:29.
Ответить с цитированием
  #9 (permalink)  
Старый 12.08.2016, 10:51
Аспирант
Отправить личное сообщение для TestUser013 Посмотреть профиль Найти все сообщения от TestUser013
 
Регистрация: 13.07.2013
Сообщений: 94

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

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

Спасибо
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Расширение для Safari. Как вызвать функцию из popover в global page? housewm Opera, Safari и др. 0 21.12.2013 06:07
Помогите подключить функцию в onclick moloko Элементы интерфейса 10 30.07.2013 08:27
NinjaKit. Не могу переопределить функцию... bodqhrohro Events/DOM/Window 3 23.10.2012 13:58
Выполнить функцию заранее неизвестную Neokortex jQuery 2 13.02.2012 12:41
проблема с передачей параметров в функцию bartonom Элементы интерфейса 4 19.09.2011 12:41