You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
			
				
					162 lines
				
				5.0 KiB
			
		
		
			
		
	
	
					162 lines
				
				5.0 KiB
			| 
								 
											2 years ago
										 
									 | 
							
								
							 | 
						||
| 
								 | 
							
								`es5-shim.js` and `es5-shim.min.js` monkey-patch a JavaScript context to
							 | 
						||
| 
								 | 
							
								contain all EcmaScript 5 methods that can be faithfully emulated with a
							 | 
						||
| 
								 | 
							
								legacy JavaScript engine.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								`es5-sham.js` and `es5-sham.min.js` monkey-patch other ES5 methods as
							 | 
						||
| 
								 | 
							
								closely as possible.  For these methods, as closely as possible to ES5
							 | 
						||
| 
								 | 
							
								is not very close.  Many of these shams are intended only to allow code
							 | 
						||
| 
								 | 
							
								to be written to ES5 without causing run-time errors in older engines.
							 | 
						||
| 
								 | 
							
								In many cases, this means that these shams cause many ES5 methods to
							 | 
						||
| 
								 | 
							
								silently fail.  Decide carefully whether this is what you want.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								## Tests
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								The tests are written with the Jasmine BDD test framework.
							 | 
						||
| 
								 | 
							
								To run the tests, navigate to <root-folder>/tests/. 
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								In order to run against the shim-code, the tests attempt to kill the current 
							 | 
						||
| 
								 | 
							
								implementation of the missing methods. This happens in <root-folder>/tests/helpers/h-kill.js.
							 | 
						||
| 
								 | 
							
								So in order to run the tests against the built-in methods, invalidate that file somehow
							 | 
						||
| 
								 | 
							
								(comment-out, delete the file, delete the script-tag, etc.).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								## Shims
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								### Complete tests ###
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								* Array.prototype.every
							 | 
						||
| 
								 | 
							
								* Array.prototype.filter
							 | 
						||
| 
								 | 
							
								* Array.prototype.forEach
							 | 
						||
| 
								 | 
							
								* Array.prototype.indexOf
							 | 
						||
| 
								 | 
							
								* Array.prototype.lastIndexOf
							 | 
						||
| 
								 | 
							
								* Array.prototype.map
							 | 
						||
| 
								 | 
							
								* Array.prototype.some
							 | 
						||
| 
								 | 
							
								* Array.prototype.reduce
							 | 
						||
| 
								 | 
							
								* Array.prototype.reduceRight
							 | 
						||
| 
								 | 
							
								* Array.isArray
							 | 
						||
| 
								 | 
							
								* Date.now
							 | 
						||
| 
								 | 
							
								* Date.prototype.toJSON
							 | 
						||
| 
								 | 
							
								* Function.prototype.bind
							 | 
						||
| 
								 | 
							
								    * /!\ Caveat: the bound function's length is always 0.
							 | 
						||
| 
								 | 
							
								    * /!\ Caveat: the bound function has a prototype property.
							 | 
						||
| 
								 | 
							
								    * /!\ Caveat: bound functions do not try too hard to keep you
							 | 
						||
| 
								 | 
							
								      from manipulating their ``arguments`` and ``caller`` properties.
							 | 
						||
| 
								 | 
							
								    * /!\ Caveat: bound functions don't have checks in ``call`` and
							 | 
						||
| 
								 | 
							
								      ``apply`` to avoid executing as a constructor.
							 | 
						||
| 
								 | 
							
								* Object.keys
							 | 
						||
| 
								 | 
							
								* String.prototype.trim
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								### Untested ###
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								* Date.parse (for ISO parsing)
							 | 
						||
| 
								 | 
							
								* Date.prototype.toISOString
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								## Shams
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								* /?\ Object.create
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    For the case of simply "begetting" an object that
							 | 
						||
| 
								 | 
							
								    inherits prototypically from another, this should work
							 | 
						||
| 
								 | 
							
								    fine across legacy engines.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /!\ Object.create(null) will work only in browsers that
							 | 
						||
| 
								 | 
							
								    support prototype assignment.  This creates an object
							 | 
						||
| 
								 | 
							
								    that does not have any properties inherited from
							 | 
						||
| 
								 | 
							
								    Object.prototype.  It will silently fail otherwise.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /!\ The second argument is passed to
							 | 
						||
| 
								 | 
							
								    Object.defineProperties which will probably fail
							 | 
						||
| 
								 | 
							
								    silently.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								* /?\ Object.getPrototypeOf
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    This will return "undefined" in some cases.  It uses
							 | 
						||
| 
								 | 
							
								    __proto__ if it's available.  Failing that, it uses
							 | 
						||
| 
								 | 
							
								    constructor.prototype, which depends on the constructor
							 | 
						||
| 
								 | 
							
								    property of the object's prototype having not been
							 | 
						||
| 
								 | 
							
								    replaced.  If your object was created like this, it
							 | 
						||
| 
								 | 
							
								    won't work:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        function Foo() {
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        Foo.prototype = {};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    Because the prototype reassignment destroys the
							 | 
						||
| 
								 | 
							
								    constructor property.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    This will work for all objects that were created using
							 | 
						||
| 
								 | 
							
								    `Object.create` implemented with this library.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								* /!\ Object.getOwnPropertyNames
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    This method uses Object.keys, so it will not be accurate
							 | 
						||
| 
								 | 
							
								    on legacy engines.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								* Object.isSealed
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    Returns "false" in all legacy engines for all objects,
							 | 
						||
| 
								 | 
							
								    which is conveniently guaranteed to be accurate.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								* Object.isFrozen
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    Returns "false" in all legacy engines for all objects,
							 | 
						||
| 
								 | 
							
								    which is conveniently guaranteed to be accurate.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								* Object.isExtensible
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    Works like a charm, by trying very hard to extend the
							 | 
						||
| 
								 | 
							
								    object then redacting the extension.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								### Fail silently
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								* /!\ Object.getOwnPropertyDescriptor
							 | 
						||
| 
								 | 
							
								    
							 | 
						||
| 
								 | 
							
								    The behavior of this shim does not conform to ES5.  It
							 | 
						||
| 
								 | 
							
								    should probably not be used at this time, until its
							 | 
						||
| 
								 | 
							
								    behavior has been reviewed and been confirmed to be
							 | 
						||
| 
								 | 
							
								    useful in legacy engines.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								* /!\ Object.defineProperty
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    This method will silently fail to set "writable",
							 | 
						||
| 
								 | 
							
								    "enumerable", and "configurable" properties.
							 | 
						||
| 
								 | 
							
								    
							 | 
						||
| 
								 | 
							
								    Providing a getter or setter with "get" or "set" on a
							 | 
						||
| 
								 | 
							
								    descriptor will silently fail on engines that lack
							 | 
						||
| 
								 | 
							
								    "__defineGetter__" and "__defineSetter__", which include
							 | 
						||
| 
								 | 
							
								    all versions of IE up to version 8 so far.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    IE 8 provides a version of this method but it only works
							 | 
						||
| 
								 | 
							
								    on DOM objects.  Thus, the shim will not get installed
							 | 
						||
| 
								 | 
							
								    and attempts to set "value" properties will fail
							 | 
						||
| 
								 | 
							
								    silently on non-DOM objects.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    https://github.com/kriskowal/es5-shim/issues#issue/5
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								* /!\ Object.defineProperties
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    This uses the Object.defineProperty shim
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								* Object.seal
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    Silently fails on all legacy engines.  This should be
							 | 
						||
| 
								 | 
							
								    fine unless you are depending on the safety and security
							 | 
						||
| 
								 | 
							
								    provisions of this method, which you cannot possibly
							 | 
						||
| 
								 | 
							
								    obtain in legacy engines.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								* Object.freeze
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    Silently fails on all legacy engines.  This should be
							 | 
						||
| 
								 | 
							
								    fine unless you are depending on the safety and security
							 | 
						||
| 
								 | 
							
								    provisions of this method, which you cannot possibly
							 | 
						||
| 
								 | 
							
								    obtain in legacy engines.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								* Object.preventExtensions
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    Silently fails on all legacy engines.  This should be
							 | 
						||
| 
								 | 
							
								    fine unless you are depending on the safety and security
							 | 
						||
| 
								 | 
							
								    provisions of this method, which you cannot possibly
							 | 
						||
| 
								 | 
							
								    obtain in legacy engines.
							 | 
						||
| 
								 | 
							
								
							 |