【レポート】
![]() |
Windows Internet Explorer 9 |
IE9は、IE8までのIEで採用しているJavaScriptゲッターメソッド__defineGetter__およびセッターメソッド__defineSetter__をサポートせずに、ECMAScript 5仕様で定められているゲッターメソッドおよびセッターメソッドの表記のみをサポートすることになった。ブラウザごとに若干動作が異なる従来の記述をサポートすることは、将来の互換性に禍根を残すというのがその理由だ。
たとえばIE8では次のようにコーディングしていたものは
myObject.__defineGetter__("p", function() {/* getter function body */});
myObject.__defineSetter__("p", function(v) {/* setter function body */});
IE9では次のようにコーディングすることになる。
Object.defineProperty(myObject,"p",
{get: function() {/* getter function body */}}
);
Object.defineProperty(myObject,"p",
{set: function(v) {/* setter function body */}}
);
しかし短期的にみると、これはWebデベロッパにIE9とIE8の双方に対応させるための追加のコーディングを強いることを意味している。どのように対応させればよいかがTransitioning Existing Code to the ES5 Getter/Setter APIs - IEBlogで紹介されている。紹介されているアプローチは2つある。従来向けのコーディングに対してIE9対応を追加する方法と、IE9向けにコーディングしたものに対して従来のコーディング対応を追加する方法だ。
//emulate legacy getter/setter API using ES5 APIs
try {
if (!Object.prototype.__defineGetter__ &&
Object.defineProperty({},"x",{get: function(){return true}}).x) {
Object.defineProperty(Object.prototype, "__defineGetter__",
{enumerable: false, configurable: true,
value: function(name,func)
{Object.defineProperty(this,name,
{get:func,enumerable: true,configurable: true});
}});
Object.defineProperty(Object.prototype, "__defineSetter__",
{enumerable: false, configurable: true,
value: function(name,func)
{Object.defineProperty(this,name,
{set:func,enumerable: true,configurable: true});
}});
}
} catch(defPropException) {/*Do nothing if an exception occurs*/};
この方法は、IE8以前向けに開発されたJavaScriptをほとんど変更することなくIE9に対応させる方法といえる。IE9で従来のコードが動作するには、要するにサポートされていない__defineGetter__および__defineSetter__を定義して用意すればいい。これを実現するために、次のステップでブラウザの提供している機能を判定し、最終的にObject.defineProperty getの処理を__defineGetter__および__defineSetter__で呼び出せるようにしている。
Object.definePropertyがあるかどうかとゲッターを定義できるかどうかは、実際にゲッターを定義しようとすることで実施している。ない場合には例外が発生するため全体がtry catchで囲まれている。2.と3.のように処理を分けて考えているのは、IE8がdefinePropertyは持っているもののDOMオブジェクトに対しては使用できないため、それを検出するためとされている。
//emulate ES5 getter/setter API using legacy APIs
if (Object.prototype.__defineGetter__&&!Object.defineProperty) {
Object.defineProperty=function(obj,prop,desc) {
if ("get" in desc) obj.__defineGetter__(prop,desc.get);
if ("set" in desc) obj.__defineSetter__(prop,desc.set);
}
}
この方法は、IE9向けに新しく開発したり、従来のコードをIE9向けに書き直したあとで、IE8以前のブラウザにも対応させるための方法となる。コーディングとしてはこちらの方が簡単だ。__defineGetter__が定義されており、かつ、Object.definePropertyが存在しない場合に、Object.definePropertyの実態として__defineGetter__および__defineSetter__を使った関数を定義するという内容になっている。なお、掲載した4つのサンプルはすべてTransitioning Existing Code to the ES5 Getter/Setter APIsに掲載されているサンプルを抜粋したもの。
Microsoftは単一のファイルで複数のブラウザに対応させる方法として機能検出ベースでのアプローチを推奨している。ブラウザを検出してコードを切り替える方法はよくないとし、機能を検出してそれに対して処理を実施するアプローチの方が優れていると主張している。Transitioning Existing Code to the ES5 Getter/Setter APIsで紹介されているコーディングはこの機能検出ベースでのアプローチを踏襲しており、実際にどういったコーディングを実施すればよいのかの参考になる。
| IE9、ほかのブラウザと同じJavaScriptコード動作へ [2010/9/6] |
| IE9 SVG性能と互換の両立困難、複雑なサンプル必要 [2010/9/3] |
| IE9、JavaScript仕様と現実の落としどころ [2010/8/31] |
| IE9、わずらわしい2pxボーダ線を排除 [2010/8/24] |
| IE9 PP4登場、SunSpiderベンチでSafari5を抜く [2010/8/10] |
| IE9のキャッシュ性能改善のしくみ [2010/7/20] |
| IE9開発版、Web Timing APIを実装 [2010/7/2] |
| IE9 Platform Preview 3登場、CanvasとVideoに対応 [2010/6/25] |
| IE9のSVGサポート、WOFFとSVG Fonts [2010/6/14] |
| IEのクラッシュ理由を見つけやすくするIE Diagnostics [2010/6/10] |
| マイナビ、3月より書籍連動型のクリエイティブ・デザイン系セミナー開講 [12:00 2/10] |
| Linux Mint 12 KDE登場 [10:26 2/10] |
| Dell、重複排除により最大98%のデータ削減が可能なバックアップストレージを発売 [09:44 2/10] |
| 北大、「ポジトロン断層撮影法」による脳腫瘍の性質を診断する手法を開発 [09:40 2/10] |
| NICTなど、手術支援ロボット「da Vinci」の3D裸眼映像伝送実証実験を計画 [09:36 2/10] |
|
米イーストマン・コダック、自社が初めて開発したデジカメ事業から撤退 [15:11 2/10] 家電 |
|
より多くのファイルをプレビュー表示できる「FenrirFS 2.3」が公開 [15:00 2/10] パソコン |
|
【女性編】役者顔負けの演技派芸人ランキング [15:00 2/10] ライフ |
|
【男性編】役者顔負けの演技派芸人ランキング [15:00 2/10] ライフ |
|
ストーム、省スペースPCにLinux搭載の「Storm Book Tower LS Linux Edition」 [14:59 2/10] パソコン |