ECMAScript5のObject.defineProperty
機能を使用して、以下のコードを考えてみましょう:IE8の壊れた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と(defineProperty
が存在する)のFirefox 4のために働き、そしてそれは、Firefox 3.6で動作します(ここで、defineProperty
存在しない)。しかしながら、IE8、only partially supports 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ライブラリでこれを使用しています、これをサポートしています。これは古いブラウザーのための列挙可能なメソッドに置き換えられます。