Hatena::Groupsubtech

ういはるかぜの化学

Thursday, December 12, 2013

Internet Explorer 9/10で__defineGetter__, __defineSetter__ が存在しない 01:01 Internet Explorer 9/10で__defineGetter__, __defineSetter__ が存在しない - ういはるかぜの化学 を含むブックマーク はてなブックマーク - Internet Explorer 9/10で__defineGetter__, __defineSetter__ が存在しない - ういはるかぜの化学

このエントリーInternet Explorer Advent Calendar 201312日目です。

ECMAScript 5th Editionにはオブジェクトプロパティゲッターセッター定義するためのObject.definePropertyというメソッドがあり、Internet Explorerは9からこのメソッド対応しています

このObject.definePropertyというものが標準になる前にほかのブラウザで先行実装されていた Object.prototype.__defineGetter__と__defineSetter__ という同じくゲッターセッター定義するメソッドがあったのですが9と10には実装されていません。ところが11になってそれを期待する実装が世の中には一定数あるせいなのか実装されたようです。

というわけで__defineGetter__と__defineSetter__を必要とする何かをInternet Explorer 910で動かしたくなることありますよね?ってお話です。

動かすためのshim

以下のようなコードを突っ込んであげれば__defineGetter__と__defineSetter__を利用できるようになります。簡単ですね。

やってることは__defineGetter__,__defineSetter__でdefinePropertyを呼び出しているだけです。

if (!Object.prototype.__defineGetter__) {
    Object.defineProperty(Object.prototype, '__defineGetter__', {
        enumerable: false,
        value: function (sprop, func) {
            var propDesc = Object.getOwnPropertyDescriptor(this) || {};
            propDesc.configurable = true;
            propDesc.get = func;
            Object.defineProperty(this, sprop, propDesc);
        }
    });
}
if (!Object.prototype.__defineSetter__) {
    Object.defineProperty(Object.prototype, '__defineSetter__', {
        enumerable: false,
        value: function (sprop, func) {
            var propDesc = Object.getOwnPropertyDescriptor(this) || {};
            propDesc.configurable = true;
            propDesc.set = func;
            Object.defineProperty(this, sprop, propDesc);
        }
    });
}
トラックバック - http://subtech.g.hatena.ne.jp/mayuki/20131212