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

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

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

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

Обновить:

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

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

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

 user243741715 июн. 2013 г., 03:08
Конечновозможно. Я'я не говорю этонет. Просто кажется мне, как тыпытаемся решить проблемы, которые кто-то другой создал для себя. Если это'то, что вы хотите сделать, тогда хорошо, но, IMO, если кто-то нарушает их собственную среду с помощью несоответствующего кода, он должен испытать последствия этих решений. Я'вместо этого потратил бы время на предоставление четкой документации.
 user243741715 июн. 2013 г., 02:58
Конечно, вы можете протестировать все возможные варианты, которые могут нарушить ваш код. Тестирование для всех функций недостаточно. Вы'Мне нужно настроить набор утверждений, чтобы гарантировать, что функции ведут себя точно так, как ожидает ваш код. В конечном счете, вам нужно решить, хотите ли вы быть разработчиком программного обеспечения или няней. ;-)
 Andrey Shchekin15 июн. 2013 г., 03:16
@CrazyTrain: Справедливо, кстати, вы можете опубликовать свое мнение (нет надежного способа сделать это) в качестве ответа, и я 'Я приму его, если я не найду / не получу другие варианты / ответы в разумные сроки.
 Andrey Shchekin15 июн. 2013 г., 03:05
@CrazyTrain да, но я не защищаюсь от вредоносного кода или профессиональной пешеходной атаки, я защищаюсь от простых ошибок.Notification это довольно распространенное название для чего-то подобного, поэтому конфликт вполне возможен.
 Andrey Shchekin15 июн. 2013 г., 02:47
Тот'Хороший ответ, но только если нет других вариантов. Мне нравится спасать людей от возможных ошибок, когда я могу.
 user243741715 июн. 2013 г., 02:40
Вы должны четко изложить экологические требования для вашей библиотеки. Тогда ты недействительно нужно беспокоиться об этом. Позвольте пользователю убедиться, что другие библиотеки будут сотрудничать.
 user243741715 июн. 2013 г., 03:00
... и что касается вашего обновления, я думаю, вы видите, что этоне надежны, так как некоторый несоответствующий код может также сделать то же самоеtoString() трюк.
 Lim H.15 июн. 2013 г., 02:47
Согласен. Если пользователь достаточно сумасшедший, чтобы использовать библиотеки, которые загрязняют глобальное пространство имен, вы мало что можете сделать, верно?
 user243741715 июн. 2013 г., 04:31
Скажу тебе что, если ты неничего другого, почему бы нене подытожите в ответ, что вымы решили. Там's элемент субъективности к этому, так как стандарты того, что охранники должны быть на месте, будут варьироваться в зависимости от человека. Я хочу сказать, что почти все в среде JavaScript может быть как-то повреждено. Я'Позволь тебе взять это оттуда. :-)

Ответы на вопрос(2)

что ссылается на ранее существующее окно. Уведомления с чем-то вроде:

window._Notification = window.Notification;

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

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

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

 John Dvorak16 июн. 2013 г., 07:32
Я думаю, вы неправильно поняли вопрос. Он хочет знать, может ли ониспользование Notification, а не как его перезаписать, ничего не сломав.
Решение Вопроса

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

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

Ваш ответ на вопрос