Blame view

app/bower_components/es5-shim/README.md 5.01 KB
f986e111b   TRUONG   add libs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
  
  `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.