代理Proxy

Proxy 对象用于定义基本操作的自定义行为(如属性查找、赋值、枚举、函数调用等)。说白了就是对目标进行代理!

操作语法:

// 创建代理,指定代理对象和代理对象操作对象

let py1 = new Proxy(target, handler)

参数target
要使用 Proxy 包装的目标对象(可以是任何类型的对象,包括原生数组,函数,甚至另一个代理)。

handler
一个通常以函数作为属性的对象,各属性中的函数分别定义了在执行各种操作时代理 proxy 的行为。

基础案例演示(直接上代码)

// 创建了一个对象,将来被proxy代理
let person = {
    name: 'Tom'
}
// 创建了一个对象,当通过代理访问目标对象时,此对象中的对应
// 方法会执行
let handler = {
    get(target, prop) {
        return '我是代理,我说的算'
        // return target[prop]
    }
}
// 创建代理,指定代理对象和代理对象操作对象
let py1 = new Proxy(person, handler)
// py1.name = "张三"
console.log(py1.name);

输出:

PS D:\D桌面\test\20220611> node .\proxyTest.js
我是代理,我说的算

修改被代理对象数据演示:

// 创建了一个对象,将来被proxy代理
let person = {
    name: 'Tom'
}
// 创建了一个对象,当通过代理访问目标对象时,此对象中的对应
// 方法会执行
let handler = {
    get(target, prop) {
        // return '我是代理,我说的算'
        return target[prop]
    }
}
// 创建代理,指定代理对象和代理对象操作对象
let py1 = new Proxy(person, handler)
py1.name = "张三"
console.log(py1.name);

输出:

PS D:\D桌面\test\20220611> node .\proxyTest.js
张三

代理拦截共13种,如下:

// 在读取代理对象的原型时触发该操作,比如在执行 Object.getPrototypeOf(proxy) 时。
handler.getPrototypeOf()

// 在设置代理对象的原型时触发该操作,比如在执行 Object.setPrototypeOf(proxy, null) 时。
handler.setPrototypeOf()
 
// 在判断一个代理对象是否是可扩展时触发该操作,比如在执行 Object.isExtensible(proxy) 时。
handler.isExtensible()
 
// 在让一个代理对象不可扩展时触发该操作,比如在执行 Object.preventExtensions(proxy) 时。
handler.preventExtensions()

// 在获取代理对象某个属性的属性描述时触发该操作,比如在执行 Object.getOwnPropertyDescriptor(proxy, "foo") 时。
handler.getOwnPropertyDescriptor()
 
// 在定义代理对象某个属性时的属性描述时触发该操作,比如在执行 Object.defineProperty(proxy, "foo", {}) 时。
andler.defineProperty()
 
// 在判断代理对象是否拥有某个属性时触发该操作,比如在执行 "foo" in proxy 时。
handler.has()

// 在读取代理对象的某个属性时触发该操作,比如在执行 proxy.foo 时。
handler.get()

// 在给代理对象的某个属性赋值时触发该操作,比如在执行 proxy.foo = 1 时。
handler.set()

// 在删除代理对象的某个属性时触发该操作,比如在执行 delete proxy.foo 时。
handler.deleteProperty()

// 在获取代理对象的所有属性键时触发该操作,比如在执行 Object.getOwnPropertyNames(proxy) 时。
handler.ownKeys()

// 在调用一个目标对象为函数的代理对象时触发该操作,比如在执行 proxy() 时。
handler.apply()
 
// 在给一个目标对象为构造函数的代理对象构造实例时触发该操作,比如在执行new proxy() 时。
handler.construct()

 同时,代理也是可以取消的,语法如下:

Proxy.revocable(target, handler)

上例子:

// 创建一个可以撤销的代理
var revocable = Proxy.revocable({}, {
    get(target, name) {
        return "[[" + name + "]]";
    }
});
// 获取代理的对象
var proxy = revocable.proxy;
// 访问代理对象的属性
console.log(proxy.test);
// 撤销代理
revocable.revoke();
// 撤销后访问代理对象的属性
console.log(proxy.test);

输出:

// 输出代理对象的属性
[[test]]
// 报错,撤销对象不可被访问
TypeError: Cannot perform 'get' on a proxy that has been revoked

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值