reactive实现
- 用什么实现响应式?
- 怎么去避免同一个对象的反复代理?
- 怎么避免代理的对象被再次代理?
function isObject(obj) {
return typeof obj === "object" && obj !== null;
}
const enum ReactiveFlags = {
IS_REACTIVE = '__v_isReactive'
}
const reactiveMap = new WeakMap();
function reactive(target) {
if(!isObject(target)) return;
if(target[ReactiveFlags.IS_REACTIVE]) {
return target;
}
let exisitingProxy = reactiveMap.get(target);
if(exisitingProxy) {
return exisitingProxy;
}
const proxy = new Proxy(target, {
get(target, key, receiver) {
if(key === ReactiveFlags.IS_REACTIVE) {
return true;
}
return Reflect.get(target, key, receiver);
},
set(target, key, value, receiver) {
return Reflect.set(target, key, value, receiver);
}
});
reactiveMap.set(target, proxy);
return proxy;
}