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
6 months 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.
|
||
|
|