Jinuss's blog Jinuss's blog
首页
  • 前端文章

    • JavaScript
  • 学习笔记

    • 《JavaScript高级程序设计》
    • 《Vue》
    • 《React》
    • 《Git》
    • JS设计模式总结
  • HTML
  • CSS
  • 技术文档
  • GitHub技巧
  • 学习
  • 实用技巧
关于
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

东流

前端可视化
首页
  • 前端文章

    • JavaScript
  • 学习笔记

    • 《JavaScript高级程序设计》
    • 《Vue》
    • 《React》
    • 《Git》
    • JS设计模式总结
  • HTML
  • CSS
  • 技术文档
  • GitHub技巧
  • 学习
  • 实用技巧
关于
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • 概览

  • 响应式系统

    • Proxy对象代理
      • effect函数
      • ref和reactive
      • computed函数
      • 响应系统里的工具函数
    • runtime运行时

    • runtime-core

    • compiler编译

    • 《Vue3源码》笔记
    • 响应式系统
    东流
    2024-07-02
    目录

    Proxy对象代理

    # 概述

    我们都知道不管是 vue2 还是 vue3,都实现了数据和视图的响应式绑定与更新,那么两者有何区别呢?

    • vue2 主要是通过数据劫持的方式,通过Object.defineProperty来通过set和get劫持数据,当数据发生变化上,会通知模板引擎重新渲染。本质上 vue3 的实现思路没有什么不同,不过 vue3 使用过Proxy进行代理
    • 还有个区别就是vue2会默认让所有的数据具备响应式的能力,而vue3则需要通过reactive和ref来声明响应式数据

    # Proxy 对象

    Proxy对象用于创建一个对象的代理,从而实现对目标对象的访问拦截和修改(如属性查找、赋值、枚举和函数调用)。

    • 语法:new Proxy(target, handler)

    target: 需要代理的目标对象(可以是任何类型,包括原生对象)

    handler: 一个对象,其属性是当执行一个操作时定义代理的行为的函数。

    # handler实例方法

    参照 MDN 文档,handler可以如下 13 种方法

    handler.apply():用于拦截函数的调用

    handler.construct():用于拦截构造函数new操作符的调用

    handler.defineProperty():用于拦截对象Object.defineProperty()操作

    handler.deleteProperty():用于拦截对对象属性的delete操作

    handler.get():用于拦截对象属性的读取

    handler.getOwnPropertyDescriptor():用于拦截Object.getOwnPropertyDescriptor()操作

    handler.getPrototypeOf():是一个代理方法,当读取代理对象的原型时,该方法就会被调用

    handler.has():拦截in操作符

    handler.isExtensible():拦截Object.isExtensible()操作

    handler.ownKeys():拦截Reflect.ownKeys(),返回一个数组;还可拦截Object.getOwnPropertyNames()和Object.getOwnPropertySymbols(),Object.keys()等

    handler.preventExtensions():拦截Object.preventExtensions()

    handler.set(): 拦截set操作

    handler.setPrototypeOf():拦截Object.setPrototypeOf()

    # Proxy在vue3中的应用

    vue3在@vue/reactivity中首先定义了BaseReactiveHandler类,其中重新定义了get方法,在get方法中会调用track方法,用于收集依赖

    MutableReactiveHandler和ReadonlyReactiveHandler会继承BaseReactiveHandler类,前者是用到最多的。

    MutableReactiveHandler类除了继承BaseReactiveHandler类外,还重写了set、deleteProperty、has和ownKeys方法,在set和deleteProperty中会调用trigger方法,用于触发依赖。

    编辑 (opens new window)
    上次更新: 2024/07/08, 08:49:22
    vue3中的错误处理方案
    effect函数

    ← vue3中的错误处理方案 effect函数→

    最近更新
    01
    GeoJSON
    05-08
    02
    Circle
    04-15
    03
    CircleMarker
    04-15
    更多文章>
    Theme by Vdoing | Copyright © 2024-2025 东流 | MIT License
    • 跟随系统
    • 浅色模式
    • 深色模式
    • 阅读模式