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とFirefox4(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ライブラリでこれを使用して、これをサポートするブラウザーで列挙不可能な配列メソッドを定義し、古いブラウザーの列挙可能なメソッドにフォールバックしています。