baseメソッドを使うとIE8で問題が発生

MS IE8のグローバルオブジェクトに関する問題

先日紹介したbaseメソッドなのですが、IE 8で問題が起きることを確認しました。
baseメソッドに関するコードや解説は以下の記事をご覧いただくとして、どんな問題かを説明します。

JavaScriptのオブジェクトを別のオブジェクトと合成させるメソッドを実装してみた

http://d.hatena.ne.jp/dhrname/20131218/p1

問題を再現するコード

まず、次のコードは、問題を再現するものです。

      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という新しいライブラリとして、このバグを修正しました。詳しくは以下の記事をご覧下さい。

base.jsの開発について

http://d.hatena.ne.jp/dhrname/20140105/p1