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
| const targetMap = new WeakMap();
function reactive(obj) { return new Proxy(obj, { get(target, key, receiver) { const res = Reflect.get(target, key, receiver); track(target, key); return isObject(res) ? reactive(res) : res; }, set(target, key, val, receiver) { const oldVal = target[key]; const hadKey = hasOwn(target, key); const result = Reflect.set(target, key, val, receiver); if (!hadKey) trigger(target, key, 'add'); else if (oldVal !== val) trigger(target, key, 'set'); return result; }, deleteProperty(target, key) { const hadKey = hasOwn(target, key); const result = Reflect.deleteProperty(target, key); if (hadKey) trigger(target, key, 'delete'); return result; } }); }
|