今天我们将尝试下花 1 分钟的时间简单地了解下什么是 JS 代理对象(proxies)?我们可以这样理解,JS 代理就相当于在对象的外层加了一层拦截,在拦截方法里我们可以自定义一些个性化的逻辑,定义完后我们可以通过代理定义的方法间接操作对象 。再说得通俗点,在我们的生活中,我们买房租房一般不找房东先找中介的道理一样,因为中介充当了房源的代理一样 。
接下来我们通过代码理解下什么是代理,用JS创建代理比较简单,如下段代码所示:
【proxies 1分钟搞懂什么是 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 defineda property named ' +property;}const proxyDog = new Proxy(dog, handler);console.log(proxyDog.name);// 将会输出 Spikeconsole.log(proxyDog.age);// 输出 You don't have defineda 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 longproxyDog.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
推荐阅读
- 循环、双向、链式、数组 一文搞懂队列
- 每天微笑1分钟可以减2公斤
- 学数据库这么久了?SQL数据库基础函数都搞懂了吗?安排
- 彻底搞懂Java线程池的工作原理
- 一文搞懂Python中的核心概念:导入,模块,包
- 一文带你搞懂RPC到底是个啥
- 不懂并行和并发?一文彻底搞懂并行和并发的区别
- 42张图,带你真正搞懂redis数据类型的底层
- reflector 带你彻底搞懂MyBatis的底层实现之反射工具箱
- 一篇文章带你搞懂Python中的类