【mini-vue】 实现 isReactive 和 isReadonly

72 阅读1分钟

实现 isReactive 和 isReadonly

主要思路

编写 isReactive 和 isReadonly 两个函数,返回对象身上的【IS_REACTIVE】或 【IS_READONYL】 属性值。 本质上:当访问对象身上的【IS_REACTIVE】或 【IS_READONYL】属性的时候,会进入get函数,在get函数中判断当前这个key是 【IS_REACTIVE】还是【IS_READONYL】,返回对应的isReadonly的值。

实现代码

export const enum ReactiveFlags {
  IS_REACTIVE = "__v_isReactive",
  IS_READONYL = "__v_isReadonly",
}
export function isReactive(value) {
  return value[ReactiveFlags.IS_REACTIVE]
} 

export function isReadonly(value) {
  return value[ReactiveFlags.IS_READONYL]
} 

细节

当判断一个普通对象的时候,由于普通对象没有经过proxy包装,进入普通对象的get函数之后没有对应的逻辑处理,因此会返回undefined(对象身上没有当前属性)。 而 经过reactive 和 readonly 包装过的值,会进入createGetter函数,当key === IS_REACTIVE 或 key === IS_READONYL的时候,就会触发对应的返回值。

处理:直接 !!undefined 将返回值变为false。

image.png

处理之后:

image.png