ts实现简易的proxy对象代理

885 阅读1分钟

这里使用Reflect来操作对象的属性,get和set image.png

具体代码

type Person = {
    name: string,
    age: number,
    text: string
}

const proxy = (object: any, key: any) => {
    //返回一个Proxy对象
    return new Proxy(object, {
        get(target, prop, receiver) {
            console.log('get', target)
            // Reflect操作对象,获取对象属性
            return Reflect.get(target, prop, receiver)
        },
        set(target, prop, value, receiver) {
            console.log('set', prop, target)
            // Reflect操作对象,设置对象属性
            return Reflect.set(target, prop, value, receiver)
        }
    })

}
//定义一个方法监听对象和对应的key
const logAccess = <T>(object: T, key: keyof T): T => {
    return proxy(object, key)
}

let man: Person = logAccess({
    name: '男',
    age: 24,
    text: '测试proxy'
}, "name")
let man2 = logAccess({
    name: '男',
    id: 2422,
    text: '测试proxy'
}, "id")
man2.id
man2.name = '30'

console.log('man2', man2)
export {
    man
}

原理就是定义一个方法去返回一个proxy对象,从而实现基本操作的拦截和自定义(如属性查找、赋值、枚举、函数调用等),要使用 Proxy 包装的目标对象(可以是任何类型的对象,包括原生数组,函数,甚至另一个代理)。