Объективное Отсутствие Caml
Я не думаю, что есть лучший способ, чем прямой тест с использованием try / catch. Это именно то, что сама команда IE рекомендует в этой недавней публикации о переходе на ES5 API .
Вы можете сократить тест до чего-то наподобие Object.defineProperty({}, 'x', {})
(вместо использования Array.prototype
), но это небольшая ошибка; В вашем примере проверяется точная функциональность (и поэтому вероятность ложных срабатываний меньше).
У меня была такая же проблема (т. Е. Object.defineProperty в IE 8 был только DOM, а не полной реализацией, как другие браузеры), но это было для полизаполнения.
Во всяком случае, я прекратил использовать проверку «функциональности», чтобы посмотреть, использовал ли я IE, он не идеален, но он работает на всех тестах, которые я мог сделать:
if (Object.defineProperty && !document.all && document.addEventListener) {
Object.defineProperty(Array.prototype,'sayHi',{value:sayHi});
} else {
Array.prototype.sayHi = sayHi;
}
как IE < = 8 не имеет document.addEventListener
, а document.all
является проприетарным расширением Microsoft к стандарту W3C. Эти две проверки эквивалентны проверке, является ли IE версией 8 или ниже.
Я использую Browserify с пакетом множественного числа из npm, в котором используется Object.defineProperty, и я удалил это.
https://github.com/inexorabletash/polyfill/blob/master/ es5.js