Proxy对象用于创建一个对象的代理,进而实现基本操作的拦截和定义。
它的基本语法是
const p = new Proxy(target, handler)
target是使用Proxy包裹的目标对象
handler是一个通常以函数作为属性的对象,其中各属性定义了执行各种操作时的代理行为,它可以有一些配置
const obj = { name: '伯约同学', age: 18 } const objProxy = new Proxy(obj, { // 获取值时的捕获器 get(target, key) { console.log(`监听到对象的${key}属性被访问了`, target) return target[key] }, // 设置值时的捕获器 set(target, key, newValue) { console.log(`监听到对象的${key}属性被设置了`, target) target[key] = newValue }, // 监听 in 捕获器 has(target, key) { console.log(`监听到对象的in操作符`, target) return key in target }, // 监听 delete 捕获器 deleteProperty(target, key) { console.log(`监听到对象的delete操作符`, target) delete target[key] }, // 获取对象原型捕获器 getPrototypeOf(target) { xxx }, // 设置对象原型捕获器 setPrototypeOf(target, prototype) { xxx }, // 是否可以扩展捕获器 isExtensible() { xxx }, // 阻止扩展捕获器 preventExtensions() { xxx }, // 获取自己的属性描述符捕获器 getOwnPropertyDescriptor() { xxx }, // 定义属性捕获器 defineProperty() { xxx }, // 监听属性名和 symbol捕获器 ownKeys() { xxx }, // 函数调用操作的捕获器,用于函数对象 apply() { xxx }, // new 操作符捕获器,用于函数对象 construct() { xxx } })
- Proxy 可以直接监听对象而非属性;
- Proxy 可以直接监听数组的变化;
- Proxy 有多达 13 种拦截方法,不限于 apply、ownKeys、deleteProperty、has 等等是Object.defineProperty 不具备的;
- Proxy 返回的是一个新对象,我们可以只操作新的对象达到目的,而 Object.defineProperty 只能遍历对象属性直接修改;
- Proxy 作为新标准将受到浏览器厂商重点持续的性能优化,也就是传说中的新标准的性能红利;