|
1 | 1 | /** |
2 | 2 | * Object.defineProperty Sham For IE |
3 | | - * @version 1.1.0 |
| 3 | + * @version 1.1.1 |
4 | 4 | * @author Ambit Tsai <ambit_tsai@qq.com> |
5 | 5 | * @license Apache-2.0 |
6 | 6 | * @see {@link https://github.com/ambit-tsai/object-defineproperty-ie} |
|
81 | 81 | for (var prop in props) { |
82 | 82 | if (has(props, prop)) { |
83 | 83 | var desc = props[prop]; |
| 84 | + checkDescriptor(desc); |
84 | 85 | if (has(descMap, prop)) { |
85 | 86 | assign(descMap[prop], desc); |
86 | 87 | } else { |
87 | 88 | descMap[prop] = desc; |
88 | 89 | } |
89 | | - checkDescriptor(descMap[prop]); |
| 90 | + setDefaultDescriptor(descMap[prop]); |
90 | 91 | } |
91 | 92 | } |
92 | 93 |
|
|
95 | 96 | window.execScript(script, 'VBS'); |
96 | 97 | obj = window['VB_factory_' + uid](); // call factory function |
97 | 98 | setInitialValue(obj, descMap); |
98 | | - window.VB_cache[uid] = { |
| 99 | + window.VB_cache[uid] = { // cache |
99 | 100 | obj: obj, |
100 | 101 | desc: descMap |
101 | 102 | }; |
|
125 | 126 | if (('value' in desc || 'writable' in desc) && ('get' in desc || 'set' in desc)) { |
126 | 127 | throw new TypeError('Invalid property descriptor'); |
127 | 128 | } |
| 129 | + if ('get' in desc && typeof desc.get !== 'function' && desc.get !== undefined) { |
| 130 | + throw new TypeError('Getter must be a function'); |
| 131 | + } |
| 132 | + if ('set' in desc && typeof desc.set !== 'function' && desc.set !== undefined) { |
| 133 | + throw new TypeError('Setter must be a function'); |
| 134 | + } |
| 135 | + } |
| 136 | + |
| 137 | + |
| 138 | + /** |
| 139 | + * Set default descriptor |
| 140 | + * @param {Object} desc |
| 141 | + */ |
| 142 | + function setDefaultDescriptor(desc) { |
128 | 143 | if ('value' in desc || 'writable' in desc) { |
129 | 144 | if (!('value' in desc)) { |
130 | 145 | desc.value = undefined; |
131 | 146 | } |
132 | 147 | desc.writable = !!desc.writable; |
133 | 148 | } else if ('get' in desc || 'set' in desc) { |
134 | | - if (typeof desc.get !== 'function' && desc.get !== undefined) { |
135 | | - throw new TypeError('Getter must be a function'); |
136 | | - } |
137 | | - if (typeof desc.set !== 'function' && desc.set !== undefined) { |
138 | | - throw new TypeError('Setter must be a function'); |
139 | | - } |
140 | 149 | desc.get = desc.get || undefined; |
141 | 150 | desc.set = desc.set || undefined; |
142 | 151 | } else { |
|
152 | 161 | * Merge object properties |
153 | 162 | * @param {Object} target |
154 | 163 | * @param {Object} source |
| 164 | + * @returns {Object} |
155 | 165 | */ |
156 | 166 | function assign(target, source) { |
157 | 167 | for (var prop in source) { |
|
0 commit comments