considere el siguiente código, usando la función de ECMAScript5 Object.defineProperty
:Trabajando aplicación Object.defineProperty roto de 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();
Esto funciona para Chrome y Firefox 4 (donde defineProperty
existe), y funciona para Firefox 3.6 (donde defineProperty
no existe). IE8, sin embargo, only partially supports defineProperty
. Como resultado, intenta ejecutar el método Object.defineProperty
, pero luego falla (sin que se muestre ningún error en el navegador) y deja de ejecutar el resto del código JavaScript en la página.
¿Hay una mejor manera de detectar y evitar la aplicación roto de IE8 que:
if (defineProperty){
try{ Object.defineProperty(Array.prototype,'sayHi',{value:sayHi}); }catch(e){};
}
if (!Array.prototype.sayHi) Array.prototype.sayHi = sayHi;
Para los curiosos, estoy usando esto en mi biblioteca ArraySetMath para definir los métodos de matriz no enumerables de los navegadores que apoye esto, con una reserva de métodos enumerables para navegadores más antiguos.