Proxy 对象的了解及学习

1. 什么是 Proxy 对象

Proxy 是 ES6 中新增的一个内置对象,用来拦截 JavaScript 操作。Proxy 可以拦截目标对象的多种操作,例如访问属性、赋值、函数调用等。通过使用 Proxy 对象,我们可以实现对目标对象的自定义行为,比如:数据验证,数据绑定,数据现场修改等。简单来说,就是可以控制对象的访问与操作行为。

Proxy 对象由两部分组成:Proxy 实例和处理程序对象(Handler)。Proxy 实例是我们要拦截的目标对象,处理程序对象是刷新操作、验证操作等的承载对象。

// 示例代码

let obj = new Proxy(target, handler)

2. Proxy 的基本使用

2.1 拦截对象属性访问

通过使用 get 方法对属性进行拦截,可以获取到目标对象的属性值,同时可以进行其他相关操作,例如数据校验、数据绑定等。

const user = { name: 'Jack', age: 22 }

const proxyUser = new Proxy(user, {

get(target, key, receiver) {

console.log(`getting ${key}!`)

return Reflect.get(target, key, receiver)

}

})

proxyUser.name // getting name!

// "Jack"

上述代码中,我们通过使用 get 对目标对象的属性进行拦截,输出了访问到的属性名。

2.2 拦截对象属性赋值

通过使用 set 方法,我们可以实现对目标对象的属性赋值进行拦截,这样可以同样拦截对象属性的删除行为。同时我们可以进行数据的修改与校验等相关操作。

const user = { name: 'Jack', age: 22 }

const proxyUser = new Proxy(user, {

set(target, key, value, receiver) {

console.log(`setting ${key}!`)

return Reflect.set(target, key, value, receiver)

}

})

proxyUser.name = "Tom" // setting name!

// "Tom"

上述代码中,我们通过使用 set 对目标对象的属性赋值进行拦截,输出了赋值的对应属性名。

3. Proxy 高级使用

3.1 拦截函数调用

通过使用 apply 方法对目标对象的函数进行拦截,我们可以得到函数的调用信息,包括拦截函数的参数、调用环境等,同时也可以对目标函数进行相应的操作,例如修正返回值、函数绑定、异常处理等。

const user = {

name: 'Tom',

sayHello(age) {

return `Hello ${this.name}, your age is ${age}`

}

}

const handler = {

apply(target, thisArg, argumentsList) {

console.log(`calling ${target.name}`)

console.log(argumentsList)

return Reflect.apply(target, thisArg, argumentsList)

}

}

const proxyUser = new Proxy(user.sayHello, handler)

proxyUser.call({ name: 'Jerry' }, 22)

// "calling sayHello"

// [22]

// "Hello Jerry, your age is 22"

上述示例拦截了目标对象的函数调用,其中 apply 拦截函数调用操作,拦截操作中可以对函数进行操作,这里我们通过输出函数调用信息来了解函数调用过程。

3.2 拦截对象接口操作

通过使用 get 方法和使用 Symbol.iterator 接口,我们可以拦截对象的接口操作,进而对操作进行一些定制化处理。

const arr = ['a', 'b', 'c']

const proxyArr = new Proxy(arr, {

get(target, key, receiver) {

if (key == Symbol.iterator) {

return function* () {

yield* target.map(item => `hello ${item}`)

}

}

return Reflect.get(target, key, receiver)

}

})

for (let item of proxyArr) {

console.log(item)

}

// "hello a"

// "hello b"

// "hello c"

上述示例中,我们拦截了数组的迭代器操作,输出了每个元素前缀为 "hello" 的项,得到了一个新数组。

小结

Proxy 对象是 ES6 中新增的一个内置对象,可以用来拦截 JavaScript 中的多种操作,包括访问属性、赋值、函数调用等。通过使用 Proxy 对象可以实现对目标对象的的数据验证、数据绑定、数据现场修改等操作。本文介绍了 Proxy 的基本使用方法和高级应用方法。了解 Proxy 对象的特性有助于我们更好地控制目标对象的访问和操作过程,实现对数据的有效监测和修正,为项目开发提供了新的思路。