1. const targetMap = new WeakMap<Object, deps>()
    2. const deps = new Map<string, effects>()
    3. const effects = new Set<effect>()
    4. const effect = () => {}
    5. const a = {
    6. 'b'1
    7. }
    8. const target = reactive(a)
    9. const example: WeakMap = new WeakMap([
    10. [
    11. a,
    12. deps: new Map([
    13. 'b',
    14. effects: new Set([
    15. () => {}
    16. ])
    17. ])
    18. ]
    19. ])
    1. // WeakMap只能用对象作为key,并且会自动垃圾回收,不会造成内存泄漏
    2. // 暴露的四种weakMap
    3. export const reactiveMap = new WeakMap<Target, any>()
    4. export const shallowReactiveMap = new WeakMap<Target, any>()
    5. export const readonlyMap = new WeakMap<Target, any>()
    6. export const shallowReadonlyMap = new WeakMap<Target, any>()
    1. // 使用一个全局变量存储被注册的副作用函数
    2. let activeEffect
    3. // 注册副作用函数
    4. function effect(fn) {
    5. activeEffect = fn
    6. fn()
    7. }
    8. const obj = new Proxy(data, {
    9. // getter 拦截读取操作
    10. get(target, key) {
    11. // 将副作用函数 activeEffect 添加到存储副作用函数的全局变量 targetMap 中
    12. track(target, key)
    13. // 返回读取的属性值
    14. return Reflect.get(target, key)
    15. },
    16. // setter 拦截设置操作
    17. set(target, key, val) {
    18. // 设置属性值
    19. const result = Reflect.set(target, key, val)
    20. // 把之前存储的副作用函数取出来并执行
    21. trigger(target, key)
    22. return result
    23. }
    24. })
    25. // 存储副作用函数的全局变量
    26. const targetMap = new WeakMap()
    27. // 在 getter 拦截器内追踪依赖的变化
    28. function track(target, key) {
    29. // 没有 activeEffect,直接返回
    30. if(!activeEffect) return
    31. // 根据 target 从全局变量 targetMap 中获取 depsMap
    32. let depsMap = targetMap.get(target)
    33. if(!depsMap) {
    34. // 如果 depsMap 不存,那么需要新建一个 Map 并且与 target 关联
    35. depsMap = new Map()
    36. targetMap.set(target, depsMap)
    37. }
    38. // 再根据 key 从 depsMap 中取得 deps, deps 里面存储的是所有与当前 key 相关联的副作用函数
    39. let deps = depsMap.get(key)
    40. if(!deps) {
    41. // 如果 deps 不存在,那么需要新建一个 Set 并且与 key 关联
    42. deps = new Set()
    43. depsMap.set(key, deps)
    44. }
    45. // 将当前的活动的副作用函数保存起来
    46. deps.add(activeEffect)
    47. }
    48. // 在 setter 拦截器中触发相关依赖
    49. function trigger(target, key) {
    50. // 根据 target 从全局变量 targetMap 中取出 depsMap
    51. const depsMap = targetMap.get(target)
    52. if(!depsMap) return
    53. // 根据 key 取出相关联的所有副作用函数
    54. const effects = depsMap.get(key)
    55. // 执行所有的副作用函数
    56. effects && effects.forEach(fn => fn())
    57. }