手写一个简易的响应式系统
class Dep { constructor() { this.subscribers = new Set(); } depend() { if (activeEffect) { this.subscribers.add(activeEffect); } } notify() { this.subscribers.forEach(effect => effect()); }}let activeEffect = null;function reactive(obj) { return new Proxy(obj, { get(target, key) { const dep = getDep(target, key); dep.depend(); return Reflect.get(target, key); }, set(target, key, value) { const dep = getDep(target, key); const result = Reflect.set(target, key, value); dep.notify(); return result; } });}function getDep(target, key) { let depsMap = targetMap.get(target); if (!depsMap) { depsMap = new Map(); targetMap.set(target, depsMap); } let dep = depsMap.get(key); if (!dep) { dep = new Dep(); depsMap.set(key, dep); } return dep;}const targetMap = new WeakMap();function effect(fn) { activeEffect = fn; fn(); activeEffect = null;}代码说明:
实现了基本的依赖收集(Dep类)和响应式对象(Proxy代理)
支持对象属性的get/set拦截,自动追踪依赖关系
使用effect函数注册副作用函数,触发时自动更新
通过WeakMap存储依赖关系,避免内存泄漏
模拟了Vue2的核心响应式机制,但未处理数组和新增属性
