diff --git a/lib/util/Global.js b/lib/util/Global.js index 597d47e..914041c 100644 --- a/lib/util/Global.js +++ b/lib/util/Global.js @@ -45,9 +45,11 @@ function Global() return new Global(); } - // allows us to extend the global object without actually polluting the - // global scope - this._global = new _G(); + // do not pollute the global scope (previously, _the_global was used as + // the prototype for a new object to take advantage of native overrides, + // but unfortunately IE<=8 did not support this and always returned + // undefined values from the prototype). + this._alt = {}; } @@ -56,8 +58,9 @@ function Global() * versions, for any root variable name, and works with ES5 strict mode. * * As an example, Node.js exposes the variable `root` to represent global - * scope, but browsers expose `window`. Further, ES5 strict mode will provde - * an error when checking whether `typeof SomeGlobalVar === 'undefined'`. + * scope, but browsers expose `window`. Further, ES5 strict mode will + * provide an error when checking whether `typeof SomeGlobalVar === + * 'undefined'`. * * @return {Object} global object */ @@ -86,12 +89,14 @@ Global.prototype = { */ provideAlt: function( name, f ) { - if ( typeof this._global[ name ] !== 'undefined' ) + if ( ( _the_global[ name ] !== undefined ) + || ( this._alt[ name ] !== undefined ) + ) { return; } - this._global[ name ] = f(); + this._alt[ name ] = f(); return this; }, @@ -112,7 +117,9 @@ Global.prototype = { */ get: function( name ) { - return this._global[ name ]; + return ( this._alt[ name ] !== undefined ) + ? this._alt[ name ] + : _the_global[ name ]; }, };