Рассмотрим следующий код, используя функцию ECMAScript5 Object.defineProperty
:
var sayHi = function(){ alert('hi'); };
var defineProperty = (typeof Object.defineProperty == 'function');
if (defineProperty) Object.defineProperty(Array.prototype,'sayHi',{value:sayHi});
else Array.prototype.sayHi = sayHi;
var a = [];
a.sayHi();
Это работает для Chrome и Firefox 4 (где defineProperty
существует), и работает для Firefox 3.6 (где defineProperty
не существует). Однако IE8 поддерживает только defineProperty
. В результате он пытается запустить метод Object.defineProperty
, но затем не удается (без ошибок, отображаемых в браузере), и перестает запускать весь код JavaScript на странице.
Есть ли лучший способ обнаружить и избежать нарушения IE8, чем:
if (defineProperty){
try{ Object.defineProperty(Array.prototype,'sayHi',{value:sayHi}); }catch(e){};
}
if (!Array.prototype.sayHi) Array.prototype.sayHi = sayHi;
Для любопытных я использую это в своей библиотеке ArraySetMath, чтобы определить методы, не перечисленные в массиве, в тех браузерах, которые поддерживают этот, с отступлением от перечислимых методов для старых браузеров.