考虑以下代码,使用 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库中使用它来在支持此功能的浏览器中定义不可枚举的数组方法,并回退到旧浏览器的可枚举方法。