Phr*_*ogz 26 javascript internet-explorer-8 ecmascript-5
使用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();
Run Code Online (Sandbox Code Playgroud)
这适用于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;
Run Code Online (Sandbox Code Playgroud)
对于好奇的人,我在我的ArraySetMath库中使用它来在那些支持它的浏览器中定义不可枚举的数组方法,并回退到旧浏览器的可枚举方法.
kan*_*gax 22
我认为没有比使用try/catch进行直接功能测试更好的方法.这实际上正是IE团队在最近关于过渡到ES5 API的帖子中推荐的.
你可以将测试缩短到类似的东西Object.defineProperty({}, 'x', {})
(而不是使用Array.prototype
),但这是一个小问题; 您的示例测试确切的功能(因此误报的可能性更小).
我正在使用Browserify和npm中的包使用Object.defineProperty进行复数化,我将其删除了.
https://github.com/inexorabletash/polyfill/blob/master/es5.js