baseメソッドを使うとIE8で問題が発生
MS IE8のグローバルオブジェクトに関する問題
先日紹介したbaseメソッドなのですが、IE 8で問題が起きることを確認しました。
baseメソッドに関するコードや解説は以下の記事をご覧いただくとして、どんな問題かを説明します。
JavaScriptのオブジェクトを別のオブジェクトと合成させるメソッドを実装してみた
baseメソッドを使ってオブジェクト指向を実現
問題を再現するコード
まず、次のコードは、問題を再現するものです。
var gl = (function(){ return this; })(); // Global Object gl.$parent = gl.base( function() { this.hoge = function() { return 12; }; this.$child = this.base( function() { this.hoge = function() { return this.$parent.hoge(); }; }); }); gl.$parent.$child.hoge(); //12
このコードをMS IE8 (Win XP)で実行すると、「オブジェクトでサポートされていないプロパティまたはメソッドです。」というエラーがでます。
判明している原因としては、windowあるいはthisといった、グローバルオブジェクトの、プロパティが委譲されていないことにあります。
たとえば、
function F() {}; F.prototype = window; // global object window.f = 12; (new F()).f; // undefined!?
今、示したコードは、本来、委譲されて、12の数値を返すはずなのです。
当然ながら、最新のOpera 18やFirefox 25でこの種類のバグは起きません。とはいっても、バージョンごとに、精査しておく必要があるかもしれません。
結論
このブログであれだけ解説しておいて、申し訳ないのですが、baseメソッドは非推奨とさせていただきます。もちろん、いろいろなブラウザを確認できる環境をお持ちの方が、このブログに載っているコードをテストしたり、改良、コピーや配布することは、うれしいことなので、ご自由にお使いください。
追記 (2月11日)
問題を解決しました
base.jsという新しいライブラリとして、このバグを修正しました。詳しくは以下の記事をご覧下さい。