JavaScript

Проверка вызывалась ли функция (подробности внутри)

Всем привет))

Попытаюсь сформулировать вопрос, возможно ли как-либо перехватить запрос на выполнение функции до её выполнения?

К примеру у меня есть некая переменная arr я запускаю функцию arr.push(blabla); но я не хочу чтобы она выполнялась, вот так сразу, а хочу предварительно перехватить этот запрос и в зависимости от разных данных обработать его по своему, возможно ли создать такую функцию?
Подскажите как, буду очень признателен!
Алексей Сиднев
Алексей Сиднев
68 755
Чтоб перехватить запрос функции надо предварительно схронить её под другим именем потом насадить свою функцию на это имя тоой функции что пытаетесь перехватить и после этого если того как ваша функция решит запускать оригинал или нет выполнить оригинальную функцию :)
Или можете поизучать объект Прокси как с ним работать

ЕЕ
Евгений Елисеев
64 843
Лучший ответ
Это можно сделать либо интерфейсом, либо расширив класс Array своим методом, либо используя Proxy (ES6).
Алексей Сиднев Спасибо, еще не добрался до Proxy
естественно язык программирования значения не имеет, ну да, зачем?

а вообще, возможно всё, напримей пойти в библиотеки ядра и переписать их.

Но такое вмешательство ооочень не понравиться антивирам если это винда, и потребует недюженных знаний если это линуха.
AD
Armen Danielyan
5 449
Алексей Сиднев Что значит не имеет? указана же категория JavaScript
например можно переопределить функцию.
при вызове arr.push(blabla), запускается функция push объекта Array.
Т. е. вы можете переопределить функцию push на свою через прототип.
Array.prototype.push = function(){ваша функция}
Правда придется переписать функционал исходного метода push со своими правками.

Поэтому наверно лучше сделать так:
объявить в объекте Array свой метод, который бы уже вызывал push в зависимости от ваших условий.

Например
Array.prototype.my_push = function(toggle, value){
if (toggle === 0) console.log('no push');
else {
this.push(value)
}
}

ну и, соотвественно, теперь вызывать не push, а my_push

let arr = [1,2,3];
arr.my_push(0, 4) // выдаст 'no push' и ничего не поменяется
arr.my_push(1, 4) // массив 'arr' теперь имеет вид [1,2,3,4]
Никола Тесла
Никола Тесла
3 760
Алексей Сиднев Спасибо!! это идеальный выход!!!