1
0
Fork 0

Global no longer uses root as alt object prototype

This is a bugfix; the bug was introduced in v0.2.3.

Initially, the implementation created a new object with the root object as
its prototype, taking advantage of ECMAScript's native
overrides/fallthroughs. Unfortunately, IE<=8 had a buggy implementation,
effectively treating the prototype as an empty object. So, rather than
alt.Array === root.Array, alt.Array === undefined.

The fix is simply to reference discrete objects.
textend
Mike Gerwitz 2014-08-07 22:33:04 -04:00
parent d0ec7aca9b
commit 324ff5ddca
1 changed files with 15 additions and 8 deletions

View File

@ -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 ];
},
};