Es6的Proxy代理是什么?有哪些用法?

一.什么是Proxy?

Proxy 对象是ES6新出的一个特性,用于创建一个对象的代理,从而实现基本操作的拦截和自定义(如属性查找、赋值、枚举、函数调用等)。

需要知道的是,在Vue2中双向数据绑定原理(数据劫持)采用Object.defineProperty,而在Vue3中数据劫持原理采用的是Proxy代理。

二.为什么Proxy会取代Object.defineProperty?

Object.defineProperty只能劫持对象的属性,不能监听数组。也不能对 es6 新产生的 Map,Set 这些数据结构做出监听。也不能监听新增和删除操作等等。

Proxy可以直接监听整个对象而非属性,可以监听数组的变化,具有多达13中拦截方法。

总而言之,Proxy 对象是ES6新出的一个特性,用于创建一个对象的代理,从而实现基本操作的拦截和自定义(如属性查找、赋值、枚举、函数调用等)。在Vue3中数据劫持原理采用的是Proxy代理。Proxy可以直接监听整个对象而非属性,可以监听数组的变化,具有多达13中拦截方法。

● get(target,propKey,receiver):拦截对象属性的读取

● set(target,propKey,value,receiver):拦截对象属性的设置

● has(target,propKey):拦截propKey in proxy的操作,返回一个布尔值

● deleteProperty(target,propKey):拦截delete proxy[propKey]的操作,返回一个布尔值

● ownKeys(target):拦截Object.keys(proxy)、for...in等循环,返回一个数组

● getOwnPropertyDescriptor(target, propKey):拦截Object.getOwnPropertyDescriptor(proxy, propKey),返回属性的描述对象

● defineProperty(target, propKey, propDesc):拦截Object.defineProperty(proxy, propKey, propDesc),返回一个布尔值

● preventExtensions(target):拦截Object.preventExtensions(proxy),返回一个布尔值

● getPrototypeOf(target):拦截Object.getPrototypeOf(proxy),返回一个对象

● isExtensible(target):拦截Object.isExtensible(proxy),返回一个布尔值

● setPrototypeOf(target, proto):拦截Object.setPrototypeOf(proxy, proto),返回一个布尔值

● apply(target, object, args):拦截 Proxy 实例作为函数调用的操作

● construct(target, args):拦截 Proxy 实例作为构造函数调用的操作

相关推荐
hpoenixf19 分钟前
一天上线 + 零返工:我如何给复杂前端需求建立“安全感”
前端
广州华水科技1 小时前
单北斗GNSS变形监测系统在水利工程安全保障中的应用与优势分析
前端
yqcoder1 小时前
CSS 外边距重叠(Margin Collapsing):现象、原理与完美解决方案
前端·css
山楂树の2 小时前
图像标注大坑:img图片 + Canvas 叠加标注,同步放大后标注位置偏移、对不齐?详解修复方案及亚像素处理原理
前端·css·学习·canva可画
本山德彪2 小时前
我做了一个拼豆图纸生成器,把照片秒变图纸
前端
DTrader2 小时前
用TS无法实盘量化? - 实盘均线策略
前端·api
进击的夸父3 小时前
vfojs:Vue 超集架构,外壳React灵魂Vue
前端
编程老船长3 小时前
解决不同项目需要不同 Node.js 版本的问题
前端·vue.js
Wect3 小时前
LeetCode 5. 最长回文子串:DP + 中心扩展
前端·算法·typescript
漫游的渔夫3 小时前
前端开发者做 Agent:别写成一次请求,用 5 步受控循环防止 AI 乱跑
前端·人工智能·typescript