Рассмотрим следующий код, используя функцию Object.defineProperty
ECMAScript5:
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 , чтобы определять неперечислимые методы массива в тех браузерах, которые поддерживают это, с отступлением от перечислимых методов для старых браузеров.