#javascript #jquery
#javascript #jquery
Вопрос:
Я поверхностно понимаю, как переопределяются функции в javascript … выполняется последний загруженный метод (с тем же именем — без подписей).
Надстройка моей веб-страницы распространяется в виде js-скрипта. Как часть его функциональности, сторонний скрипт вызывает метод ‘x ()’ при его загрузке. Пользователи моего дополнения могут уже иметь метод x() на своей веб-странице для взаимодействия (по-своему) с этим сторонним скриптом. Если они этого не делают, я хочу выполнить свою. Проблема в том, что мой x() переопределяет их, а это не то поведение, которое требуется.
Лично я думаю, что это немного безумно, с задержкой в Интернете, переопределять функции с помощью «последних правил». Думаю, это уже другая история.
К счастью, я могу искать конкретный div и знаю, что у клиента будет свой собственный метод x(), и он условно добавил мой метод в качестве отдельного скрипта. Таким образом, мой метод присутствует на странице только в том случае, если их нет.
Есть ли более элегантный способ сделать это? По сути, я хотел бы x(), который недооценит x() клиента. Я обеспокоен тем, что в какой-то момент я не смогу легко проверить их x() . Кстати … проверка наличия x() с помощью typeof === 'function'
просто возвращает true для моего x() .
Комментарии:
1.Проверьте наличие существующей,
x
прежде чем создавать свою.2. @Pointy собирался предложить то же самое 🙂
3. поскольку ваш код является надстройкой, он должен иметь свою собственную область видимости, чтобы избежать конфликтов с сосуществующими переменными JS и, в целом, предотвратить загрязнение глобальной области видимости. Для достижения этой цели используйте область видимости, например, IIFE
4. @Pointy будет, но должен быть глобальным. Объявляется перед самозваным методом.
5. @Benediktas это было бы неплохо, но я посмотрел на это и не вижу никакого способа использовать стороннюю библиотеку и клиентские скрипты. Отчасти для того, чтобы мой интерфейс «api» был простым. Не хочу, чтобы пользователь передавал мне свои функции. Это становится действительно неаккуратным.
Ответ №1:
Глобальное загрязнение пространства имен — ужасная вещь. Это разрушает семьи и разрушает наши города. Однако в этом случае вы можете смягчить проблему:
let existingX = window.x || undefined;
function x(whatever) {
if (existingX amp;amp; typeof existingX == 'function') {
existingX(whatever);
}
else {
// all of your version of x
}
}
Если хотите, вы можете использовать более неясное имя, чем «existingX», чтобы избежать еще одного столкновения.
Другим вариантом может быть:
var x = window.x amp;amp; typeof window.x == 'function' ? window.x : function(whatever) {
// your code
};
Конечно, если существующая x
функция — это нечто иное, чем функция, которая намеревается переопределить вашу, вы мало что можете сделать, кроме, может console.log()
быть, строгого предупреждения.
Комментарии:
1. Так что используйте это глобально?
2. @StephanLuis да, потому что (как я понял ваше объяснение) страницы, использующие ваш сервис, должны
x
быть глобальной функцией. (В любом случае, это, вероятно, единственный практический выбор.)