当前位置:网站首页>JS的Proxy
JS的Proxy
2022-07-01 18:46:00 【Dragon_qing】
Proxy
概念
一个 Proxy 对象包装另一个对象并拦截诸如读取/写入属性和其他操作,可以选择自行处理它们,或者透明地允许该对象处理它们。
Proxy 被用于了许多库和某些浏览器框架。在本文中,我们将看到许多实际应用。
语法
let proxy = new Proxy(target, handler)
参数
target—— 是要包装的对象,可以是任何东西,包括函数。handler—— 代理配置:带有“捕捉器”(“traps”,即拦截操作的方法)的对象。比如get捕捉器用于读取target的属性,set捕捉器用于写入target的属性,等等。对
proxy进行操作,如果在handler中存在相应的捕捉器,则它将运行,并且 Proxy 有机会对其进行处理,否则将直接对 target 进行处理。
例子
let target = {
};
let proxy = new Proxy(target, {
}); // 空的 handler 对象
proxy.test = 5; // 写入 proxy 对象 (1)
alert(target.test); // 5,test 属性出现在了 target 中!
alert(proxy.test); // 5,我们也可以从 proxy 对象读取它 (2)
for(let key in proxy) alert(key); // test,迭代也正常工作 (3)
由于没有捕捉器,所有对 proxy 的操作都直接转发给了 target。
- 写入操作
proxy.test=会将值写入target。 - 读取操作
proxy.test会从target返回对应的值。 - 迭代
proxy会从target返回对应的值。
我们可以看到,没有任何捕捉器,proxy 是一个 target 的透明包装器(wrapper)。

常用的捕捉器
get
要拦截读取操作,handler 应该有 get(target, property, receiver) 方法。
参数
target—— 是目标对象,该对象被作为第一个参数传递给new Proxy,property—— 目标属性名,receiver—— 如果目标属性是一个 getter 访问器属性,则receiver就是本次读取属性所在的this对象。通常,这就是proxy对象本身(或者,如果我们从 proxy 继承,则是从该 proxy 继承的对象)。
例子:
let numbers = [0, 1, 2];
numbers = new Proxy(numbers, {
get(target, prop) {
if (prop in target) {
return target[prop];
} else {
return 0; // 默认值
}
}
});
alert( numbers[1] ); // 1 注意如果numbers = [0, 2, 1]则结果为2.因为返回的是target[prop]
alert( numbers[123] ); // 0(没有这个数组项)
注意
代理应该在所有地方都完全替代目标对象。目标对象被代理后,任何人都不应该再引用目标对象。否则很容易搞砸。
set
假设我们想要一个专门用于数字的数组。如果添加了其他类型的值,则应该抛出一个错误。
当写入属性时 set 捕捉器被触发。
set(target, property, value, receiver)
参数
target—— 是目标对象,该对象被作为第一个参数传递给new Proxy,property—— 目标属性名称,value—— 目标属性的值,receiver—— 与get捕捉器类似,仅与 setter 访问器属性相关。
例子
let numbers = [];
numbers = new Proxy(numbers, {
// (*)
set(target, prop, val) {
// 拦截写入属性操作
if (typeof val == 'number') {
target[prop] = val;
return true;
} else {
return false;
}
}
});
numbers.push(1); // 添加成功
numbers.push(2); // 添加成功
alert("Length is: " + numbers.length); // 2
numbers.push("test"); // TypeError(proxy 的 'set' 返回 false)
alert("This line is never reached (error in the line above)");
别忘了返回 true
对于 set 操作,它必须在成功写入时返回 true。
其他捕捉器
| 内部方法 | Handler 方法 | 何时触发 |
|---|---|---|
[[Get]] | get | 读取属性 |
[[Set]] | set | 写入属性 |
[[HasProperty]] | has | in 操作符 |
[[Delete]] | deleteProperty | delete 操作符 |
[[Call]] | apply | 函数调用 |
[[Construct]] | construct | new 操作符 |
[[GetPrototypeOf]] | getPrototypeOf | Object.getPrototypeOf |
[[SetPrototypeOf]] | setPrototypeOf | Object.setPrototypeOf |
[[IsExtensible]] | isExtensible | Object.isExtensible |
[[PreventExtensions]] | preventExtensions | Object.preventExtensions |
[[DefineOwnProperty]] | defineProperty | Object.defineProperty, Object.defineProperties |
[[GetOwnProperty]] | getOwnPropertyDescriptor | Object.getOwnPropertyDescriptor, for..in, Object.keys/values/entries |
[[OwnPropertyKeys]] | ownKeys | Object.getOwnPropertyNames, Object.getOwnPropertySymbols, for..in, Object.keys/values/entries |
边栏推荐
- SIP protocol of gb28181
- 安装sharp报错
- OpenCV视频质量检测--清晰度检测
- Reading the paper [learning to discretely compose reasoning module networks for video captioning]
- 利用win7漏洞进行系统登录密码破解
- What must be done in graduation season before going to Shanhai
- 微信小程序 navigator点击后有阴影 ,去掉navigator阴影效果
- Botu V16 obtains the system time and converts it into a string
- Interview question 16.16 Partial sorting - Double finger needling
- Introduction to relevant processes and functions of wechat official account development
猜你喜欢
随机推荐
Instagram 为何从内容共享平台变成营销工具?独立站卖家如何利用该工具?
Mysql查询结果去除换行
How to configure webrtc video streaming format for easygbs, a new version of national standard gb28181 video platform?
uni-app微信小程序一键登录获取权限功能
通过js实现金字塔(星号金字塔,回文对称数字金字塔)
精耕渠道共謀發展 福昕攜手偉仕佳傑開展新產品培訓大會
torch.nn.functional.interpolate函数
Nat penetration of gb28181
集合对象值改变NULL值对象
Opencv video quality diagnosis - VIDEO occlusion diagnosis
ffmpeg 错误码
A brief understanding of white box encryption technology
GB28181之SIP协议
使用 Kibana Timelion 进行时间序列分析
OpenCV视频质量检测--清晰度检测
Actual combat of flutter - fast implementation of audio and video call application
H264 encoding profile & level control
简版拼多多商品数据
Interview questions for audio and video positions in Dachang -- today's headline
OpenCV视频质量诊断----视频遮挡诊断








