* Define a reactive property on an Object. * * @param {Object} obj * @param {String} key * @param {*} val
(obj, key, val)
| 2250 | */ |
| 2251 | |
| 2252 | function defineReactive(obj, key, val) { |
| 2253 | var dep = new Dep(); |
| 2254 | |
| 2255 | var property = Object.getOwnPropertyDescriptor(obj, key); |
| 2256 | if (property && property.configurable === false) { |
| 2257 | return; |
| 2258 | } |
| 2259 | |
| 2260 | // cater for pre-defined getter/setters |
| 2261 | var getter = property && property.get; |
| 2262 | var setter = property && property.set; |
| 2263 | |
| 2264 | var childOb = observe(val); |
| 2265 | Object.defineProperty(obj, key, { |
| 2266 | enumerable: true, |
| 2267 | configurable: true, |
| 2268 | get: function reactiveGetter() { |
| 2269 | var value = getter ? getter.call(obj) : val; |
| 2270 | if (Dep.target) { |
| 2271 | dep.depend(); |
| 2272 | if (childOb) { |
| 2273 | childOb.dep.depend(); |
| 2274 | } |
| 2275 | if (isArray(value)) { |
| 2276 | for (var e, i = 0, l = value.length; i < l; i++) { |
| 2277 | e = value[i]; |
| 2278 | e && e.__ob__ && e.__ob__.dep.depend(); |
| 2279 | } |
| 2280 | } |
| 2281 | } |
| 2282 | return value; |
| 2283 | }, |
| 2284 | set: function reactiveSetter(newVal) { |
| 2285 | var value = getter ? getter.call(obj) : val; |
| 2286 | if (newVal === value) { |
| 2287 | return; |
| 2288 | } |
| 2289 | if (setter) { |
| 2290 | setter.call(obj, newVal); |
| 2291 | } else { |
| 2292 | val = newVal; |
| 2293 | } |
| 2294 | childOb = observe(newVal); |
| 2295 | dep.notify(); |
| 2296 | } |
| 2297 | }); |
| 2298 | } |
| 2299 | |
| 2300 | |
| 2301 |
no test coverage detected