У меня есть функция, a()
которую я хочу переопределить, но оригинал a()
должен быть выполнен в порядке, зависящем от контекста. Например, иногда, когда я генерирую страницу, я хочу переопределить так:
function a() {
new_code();
original_a();
}
а иногда так:
function a() {
original_a();
other_new_code();
}
Как я могу получить это original_a()
из-за переезда a()
? Это вообще возможно?
Пожалуйста, не предлагайте альтернативы перегрузке таким образом, я знаю многих. Я спрашиваю об этом конкретно.
(functi..
и})
. Простое выполнение}();
даст тот же результат, что и(function{})()
1-й набор скобок, потому что вы не можете просто объявить анонимное выражение функции, которое вам нужно назначить. Но, делая (), вы ничего не определяете, просто возвращая функцию.a
, не вызывая ее и сохраняя возвращаемое значение. Скобки дают мне понять, что происходит что-то еще.Шаблон Proxy может помочь вам:
источник
Спасибо, ребята, шаблон прокси действительно помог ..... На самом деле я хотел вызвать глобальную функцию foo .. На некоторых страницах мне нужно выполнить некоторые проверки. Итак, я сделал следующее.
Спасибо, это действительно помогло мне
источник
org_foo(args)
вызоваorg_foo.call(this, args)
. Это поддерживается так,this
как это было бы, когда window.foo вызывает нормально (без прокси). Посмотри этот ответВы можете переопределить функцию, используя такую конструкцию, как:
Например:
Изменить: Исправлена опечатка.
источник
Передавая произвольные аргументы:
источник
original_a
хотя?Ответ, который дает @Matthew Crumley, заключается в использовании немедленно вызванных выражений функций, чтобы закрыть старую функцию 'a' в контексте выполнения возвращаемой функции. Я думаю, что это был лучший ответ, но лично я предпочел бы передать функцию «а» в качестве аргумента IIFE. Я думаю, что это более понятно.
источник
Приведенные выше примеры неправильно применяются
this
или передаютсяarguments
корректно в функцию переопределения. Подчеркивание _.wrap () оборачивает существующие функции, применяетthis
и передаетarguments
правильно. Смотрите: http://underscorejs.org/#wrapисточник
У меня был какой-то код, написанный кем-то другим, и я хотел добавить строку в функцию, которую я не смог найти в коде. Поэтому в качестве обходного пути я хотел переопределить это.
Ни одно из решений не помогло мне.
Вот что сработало в моем случае:
источник
Я создал небольшой помощник для аналогичного сценария, потому что мне часто приходилось переопределять функции из нескольких библиотек. Этот помощник принимает «пространство имен» (контейнер функции), имя функции и переопределяющую функцию. Он заменит исходную функцию в указанном пространстве имен новой.
Новая функция принимает исходную функцию в качестве первого аргумента, а исходные функции - в качестве остальных. Это сохранит контекст каждый раз. Он также поддерживает функции void и non void.
Использование, например, с Bootstrap:
Я не создавал никаких тестов производительности, хотя. Это может добавить некоторые нежелательные накладные расходы, которые могут или не могут иметь большое значение, в зависимости от сценариев.
источник
По моему мнению, верхние ответы не читабельны / не поддерживаются, а другие ответы не связывают должным образом контекст. Вот удобочитаемое решение с использованием синтаксиса ES6 для решения обеих этих проблем.
источник
Так что мой ответ оказался решением, которое позволяет мне использовать переменную _this, указывающую на исходный объект. Я создаю новый экземпляр «Квадрата», но ненавидел то, как «Квадрат» генерировал его размер. Я думал, что это должно следовать моим конкретным потребностям. Однако для того, чтобы сделать это, мне потребовалось, чтобы в квадрате была обновленная функция «GetSize» с внутренними компонентами этой функции, вызывающими другие функции, уже существующие в квадрате, такие как this.height, this.GetVolume (). Но для этого мне нужно было делать это без каких-либо сумасшедших взломов. Так вот мое решение.
Какой-то другой инициализатор объекта или вспомогательная функция.
Функция в другом объекте.
источник
Не уверен, что это будет работать при любых обстоятельствах, но в нашем случае мы пытались переопределить
describe
функцию в Jest, чтобы мы могли проанализировать имя и пропустить весьdescribe
блок, если он удовлетворял некоторым критериям.Вот что сработало для нас:
Здесь важны две вещи:
Мы не используем функцию стрелки
() =>
.Функции стрелок меняют ссылку на,
this
и нам нужно, чтобы это было в файлеthis
.Использование
this.describe
иthis.describe.skip
вместо всегоdescribe
иdescribe.skip
.Опять же, не уверен, что это кому-то полезно, но мы изначально пытались избежать превосходного ответа Мэтью Крамли, но нам нужно было сделать наш метод функцией и принять параметры, чтобы проанализировать их в условных выражениях.
источник