Каков наиболее надежный подход к обнаружению поддержки функций браузера?

Скажем, я хочу обнаружить поддержку уведомлений (http://notifications.spec.whatwg.org/) в библиотеке JavaScript.

Я могу использовать window.Notification !== undefined. Но что, если пользователи библиотеки (или другой библиотеки) также имеют какой-то глобальный объект Notification, определенный для совершенно другой цели?

С другой стороны, что, если другая библиотека является polyfill? Тогда их объект Notification является приемлемым. Должен ли я тестировать все методы в дополнение к тестированию для глобального объекта?

Обновление:
Я заметил интересную вещь в одном уведомлениях polyfill:

ret[toString] = function() {
    return 'function Notification() { [native code] }';
};

Насколько надежно полагается что-то подобное, чтобы определить, является ли он родным / polyfill объектом?

Ответ 1

Таким образом, по существу есть два варианта.

Сначала нужно попробовать и полагаться на значение 'function Notification() { [native code] }' toString, поскольку оно задается по меньшей мере несколькими полиполками. К сожалению, это ненадежно, поскольку я не нашел информации о том, является ли это общим подходом в polyfill авторах и является ли это надежным возвращаемым значением в браузерах.

Другой вариант, как предлагается в комментариях, состоит в том, чтобы игнорировать потенциальные конфликты и просто идти вперед, просто проверяя существование. Это то, к чему я пошел сейчас.

Ответ 2

Вы всегда можете использовать подход jQuery и переопределять все, что ссылается на ранее существующее окно. Обозначения с чем-то вроде:

window._Notification = window.Notification;

Пол Ирландский немного в это видео, которое очень хорошо объясняет, как это работает.

Таким образом, вы можете продолжить реализацию любой другой функции, которую они используют, в то же время, включая ваши.

Надеюсь, что это поможет.:)