网站首页 > 技术文章 正文
今天我们将尝试下花 1 分钟的时间简单地了解下什么是 JS 代理对象(proxies)?我们可以这样理解,JS 代理就相当于在对象的外层加了一层拦截,在拦截方法里我们可以自定义一些个性化的逻辑,定义完后我们可以通过代理定义的方法间接操作对象。再说得通俗点,在我们的生活中,我们买房租房一般不找房东先找中介的道理一样,因为中介充当了房源的代理一样。
接下来我们通过代码理解下什么是代理,用JS创建代理比较简单,如下段代码所示:
let initialObject = { /* 定义对象 */ };
let handler = { /* 自定义相关的拦截器处理逻辑 */ };
let proxyedObject = new Proxy(initialObject, handler);
简单解释下,我们可以通过代理去调用 handler 里定义的逻辑去操作对象,对象代理有两个参数,initialObject 是目标对象,handler 拦截器对象(或者称作处理器对象)。
接下来,我们来看一个例子,我们通过代理实现读取一个对象的属性,如果对象的属性不存在,则返回代理中定义的默认值,这里我们在代理里重写了原有对象的 get 方法。
let dog = {
name: "Spike"
};
const handler = {
get: (obj, property) => property in obj ? obj[property] : 'You don't have defined a property named ' + property;
}
const proxyDog = new Proxy(dog, handler);
console.log(proxyDog.name);
// 将会输出 Spike
console.log(proxyDog.age);
// 输出 You don't have defined a property named age
上述例子,我们通过 get: (obj, property) => ... 方法重写了对象的 get 方法。
最后我再看一个如何通过代理去更对对象的值,如果更新的值不是我们期望的值,系统则抛出异常错误,不能正常更新,否则重新赋值并更新对象的属性。
let dog = {
name: "Spike",
age: 1;
};
let handler = {
set: (obj, property, value) => {
if (property === 'age') {
if (!Number.isInteger(value)) throw new TypeError('Use numbers only for age');
if ((value < 0) || (value > 30)) throw new RangeError('A dog can't live that long');
}
obj[prop] = value;
return true;
}
};
const proxyDog = new Proxy(dog, handler);
proxyDog.age = -1;
// will throw A dog can't live that long
proxyDog.age = 'very old';
// will throw Use numbers only for age
通过 JS 代理我们不仅可以重写 getters 和 setters 方法,我们还可以进行这些操作:deleteProperty、construct、getOwnPropertyDescriptor 等...
今天的文章就到这里,不知道你是否理解代理对象啦,在接下来的文章里,我们再聊聊代理在实际项目中的运用,感谢你的阅读。
参考来源:http://www.js-craft.io/blog/what-are-javascript-proxies/
Daniel
猜你喜欢
- 2024-10-18 前端反向代理(前端反向代理怎么配置)
- 2024-10-18 JavaScript 九种跨域方式实现原理
- 2024-10-18 Proxy 来代理 JavaScript 里的类(js中proxy)
- 2024-10-18 octokit.js:2023每个前端都值得学习的通用SDK!
- 2024-10-18 一面 2:JS-Web-API 知识点与高频考题解析
- 2024-10-18 使用reveal.js制作精美的网页版PPT
- 2024-10-18 es6中的代理-Proxy(es proxy)
- 2024-10-18 事件——《JS高级程序设计》(javascript高级程序设计 javascript权威指南)
- 2024-10-18 「JavaScript 从入门到精通」18.WebApi介绍
- 2024-10-18 day7:前端面试题(js)(前端面试题2021及答案js)
- 最近发表
- 标签列表
-
- cmd/c (64)
- c++中::是什么意思 (83)
- 标签用于 (65)
- 主键只能有一个吗 (66)
- c#console.writeline不显示 (75)
- pythoncase语句 (81)
- es6includes (73)
- sqlset (64)
- windowsscripthost (67)
- apt-getinstall-y (86)
- node_modules怎么生成 (76)
- chromepost (65)
- c++int转char (75)
- static函数和普通函数 (76)
- el-date-picker开始日期早于结束日期 (70)
- localstorage.removeitem (74)
- vector线程安全吗 (70)
- & (66)
- java (73)
- js数组插入 (83)
- linux删除一个文件夹 (65)
- mac安装java (72)
- eacces (67)
- 查看mysql是否启动 (70)
- 无效的列索引 (74)