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
| import Reaction from './reaction'
function deepProxy(val, handler) { if (typeof val !== 'object') return val for (let key in val) { val[key] = deepProxy(val[key], handler) }
return new Proxy(val, handler()) }
function createObservable(val) { let handler = () => { let reaction = new Reaction()
return { get(target, key) { reaction.collect() return Reflect.get(target, key) }, set(target, key, value) { if (key === 'length') return true let r = Reflect.set(target, key, value) reaction.run() return r }, } } return deepProxy(val, handler) }
function observable(target, key, descriptor) { if (typeof key === 'string') { let v = descriptor.initializer() v = createObservable(v) let reaction = new Reaction() return { enumerable: true, configurable: true, get() { reaction.collect() return v }, set(value) { v = value reaction.run() }, } } return createObservable(target) }
export default observable
|