Consultez le code suivant, en utilisant la fonction de ECMAScript5 Object.defineProperty
:Contourner cassé la mise en œuvre de Object.defineProperty IE8
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();
Cela fonctionne pour 4 Chrome et Firefox (où existe defineProperty
), et cela fonctionne pour Firefox 3.6 (où defineProperty
n'existe pas). IE8, cependant, only partially supports defineProperty
. Par conséquent, il tente d'exécuter la méthode Object.defineProperty
, mais échoue ensuite (sans erreur affichée dans le navigateur) et cesse d'exécuter tous les autres codes JavaScript sur la page.
Y at-il une meilleure façon de détecter et d'éviter la mise en œuvre brisée IE8 que:
if (defineProperty){
try{ Object.defineProperty(Array.prototype,'sayHi',{value:sayHi}); }catch(e){};
}
if (!Array.prototype.sayHi) Array.prototype.sayHi = sayHi;
Pour les curieux, je me sers dans ma bibliothèque ArraySetMath pour définir les méthodes de tableau non-dénombrables dans les navigateurs Soutenez ceci, avec un repli vers des méthodes énumérables pour les navigateurs plus anciens.