1. Proxy代理


// 供应商(原始对象)let obj = {time:'2018-01-03',name:'net',_r: "123"}// 创建代理商,传入obj数据let monitor = new Proxy(obj,{get(target,key){ // 拦截对象属性的读取 target是传入的对象objreturn target[key].replace('2017','2018');},set(target,key,value){ // 拦截对象设置属性if(key === 'name'){return target[key] = value;}else{return target[key];}},has(target,key){  // 拦截key in object 操作if(key ==='name'){return target[key]}else{return false;}},deleteProperty(target,key){  // 拦截delete 除了_r属性能删除,其他不行if(key.indexOf('_')>-1){delete target[key];return true;}else{return target[key];}},// 拦截Object.keys , Object.getOwnPropertySymbols , Object.getOwnPropertyNamesownKeys(target){return Object.keys(target).filter(item=>item!='time');}});// 用户获取console.log('get',monitor.time); // get 2018-01-03monitor.time = '2019'; console.log('get',monitor.name); // get netconsole.log('set',monitor.time); // set 2018-01-03  代理拦截的只能设置name属性monitor.name = 'yiteer';console.log('set',monitor.name); // set yiteer    name属性设置成功// 拦截key in object 操作欺骗了用户,代理设置name是obj的属性,其他不是  console.log('has','name' in monitor,'time' in monitor); //has true false// 删除time属性delete monitor.time;console.log('delete_time',monitor.time);   //  delete_time 2018-01-03// 删除_r属性delete monitor._r;console.log('delete_r' , monitor._r)       // undefined// 过滤属性名不是time的属性console.log('ownKeys',Object.keys(monitor)); // ["name", "_r"]}

2. Reflect反射(反射的是obj)

Reflect 的特性和Proxy的用法非常类似   不用new一个实例, 直接用即可

// 供应商(原始对象)let obj = {time:'2018-01-03',name:'net',_r: "123"}// 获取对象的值console.log('Reflect get',Reflect.get(obj,'time')); // Reflect get 2018-01-03// 设置对象的值Reflect.set(obj,'name','xiaxiaoxian');console.log(obj);  // {time: "2018-01-03", name: "xiaxiaoxian", _r: "123"}// 判断对象是否拥有某个属性console.log('has',Reflect.has(obj,'name')) // has true

3. 利用Proxy代理创建一个信息校验的函数

function validator(target,validator){return new Proxy(target,{  // target指person的实例_validator:validator,set(target,key,value,proxy){ // 代理对set有限制if(target.hasOwnProperty(key)){let va = this._validator[key];if(!!va(value)){return Reflect.set(target,key,value,proxy);}else{throw Error(`不能设置${key}到${value}`)}}else{throw Error(`${key} 不存在`)}}})}const personValidators = {name(val){return typeof val === 'string'},age(val){return typeof val === 'number' && val>18},mobile(val){// 对手机的限制...}}// 创建一个构造函数class Person {constructor(name,age,mobile){this.name = name;this.age = age;this.mobile = '13735872697'return validator(this,personValidators); // this是person的实例,但是被代理了}}// 实例化一个对象const person = new Person('lilei',30);console.log(person); //{name: "lilei", age: 30, mobile: "13735872697"}// 修改//person.name = 48;  //报错 : 不能设置name到48person.name = 'xiaxaioxian';//person.age = 17;   // 报错 :Uncaught Error: 不能设置age到17//person.class = '304班'; // 报错: Uncaught Error: class 不存在console.info(person); // {name: "xiaxaioxian", age: 30, mobile: "13735872697"}

Proxy代理 和 Reflect反射(反射的是obj)的概念相关推荐

  1. 利用 Proxy 代理与 Reflect 反射实现 mv 模型视图,实现一个 打怪升级 的小游戏“勇士之战”

    利用 Proxy 代理与 Reflect 反射实现 mv 模型视图,多层数据动态渲染页面,模仿 vue3 双向绑定中 viewModel 核心功能,实现一个 打怪升级 的小游戏"勇士之战&q ...

  2. Proxy(代理,拦截器),Reflect(反射)

    Proxy(代理,拦截器),Reflect(反射) Proxy: 代理: var duixaing = {"name":"小胖","age" ...

  3. JavaScript 中Proxy(代理)和Reflect(反射)基础知识

    JavaScript 中Proxy(代理)和Reflect(反射)基础知识   最近在Vue3项目开发中,我们经常使用与Proxy和Reflect相关的函数.这些函数以各种形式出现在Vue3 Reac ...

  4. 自己写一个java.lang.reflect.Proxy代理的实现

    前言 Java设计模式9:代理模式一文中,讲到了动态代理,动态代理里面用到了一个类就是java.lang.reflect.Proxy,这个类是根据代理内容为传入的接口生成代理用的.本文就自己写一个Pr ...

  5. Proxy是代理,Reflect是干嘛用的?

    一.Reflect有什么用? 一句话,Reflect没什么用,除了装装逼,让人看起来高大上以外,并不具有什么牛逼之处. 准确讲应该是这样的,Reflect更像是一种语法变体,其挂在的所有方法都能找到对 ...

  6. 面试官:什么是静态代理?什么是动态代理?注解、反射你会吗?

    前言 开场 一位穿着蓝色衬衫,牛仔裤,拿着一个白色保温杯的中年男子急匆匆地坐在你对面,看样子是项目上的东西很急,估摸面试时间不会太长,这样一想心情放松了许多-(后来我就被打脸了) ​ ​ 面试开始 面 ...

  7. ES6之Proxy代理

    什么是Proxy代理 ES6 让开发者能进一步接近 JS 引擎的能力,这些能力原先只存在于内置对象上.语言通过代 理( proxy )暴露了在对象上的内部工作,代理是一种封装,能够拦截并改变 JS 引 ...

  8. Java反射——反射机制问题——第一章

    Java反射--反射机制问题--第一章 Java反射--Class类--第二章 Java反射--类加载--第三章 Java反射--反射获取类的结构信息--第四章 文章目录 1:一个需求引出反射 2:反 ...

  9. java Proxy(代理机制)

    我们知道Spring主要有两大思想,一个是IoC,另一个就是AOP,对于IoC,依赖注入就不用多说了,而对于Spring的核心AOP来说,我们不但要知道怎么通过AOP来满足的我们的功能,我们更需要学习 ...

最新文章

  1. 支持向量机SVM 参数选择
  2. mysql联合索引的数据结构
  3. jmeter生成html报告修改,jmeter:测试后生成html报告
  4. C#中JSON和对象之间互相转换功能示例
  5. asp.net mvc使用mysql_ASP.NET开发实战——(八)ASP.NET MVC 与数据库之MySQL
  6. uni-app动态绑定class和style
  7. python下电影_Python3.6实现根据电影名称(支持电视剧名称),获取下载链接的方法...
  8. 瞧瞧UC浏览器对CSS样式的“关怀”
  9. 2022年推出?特斯拉人形机器人被批就是个笑话
  10. futuretask java 并发请求_Java并发机制(9)--Callable、Future、FutureTask的使用
  11. 算法导论 练习10.4-5二叉树的遍历
  12. C# 创建进程但是失败,原因是什么
  13. python中双引号的作用_Python中单引号和双引号的作用
  14. 基于收发一体超声波探头的超声波测距方案(附源代码和原理图)
  15. OpenCASCADE(OCC)读取STEP模型文件到XDE中
  16. 【Java并发基础】Java内存模型解决有序性和可见性
  17. 普适计算-2014/03/28
  18. 高德地图自定义镂空区域
  19. html音乐播放器样式,html5扁平化mp3音乐播放器样式代码
  20. 已知由单链表表示的线性表中含有三类字符(数字,字母和其他字符)试编写算法来构造三个循环链表,使每个表中只含某一类字符,且利用原表中的结点空间作为这三个表的结点空间,头结点可另辟空间。

热门文章

  1. jfinal linux 乱码,分享JFinal中renderFile方法中文文件名乱码问题的解决办法
  2. php根据键值去除数组中的某个元素_php删除数组中指定值的元素的几种方法
  3. java linux urlencode_iOS urlEncode编码解码(非过时方法,已解决)
  4. php中的interface和implements及其他
  5. 十年Java编程开发生涯,java计算时间差毫秒
  6. mooc浙大数据结构PTA习题之一元多项式的乘法与加法运算
  7. python数值型转换字符型_2.6 字符型常量
  8. python桌面图标被删了_Python实现图标锁定到Windows任务栏或删除图标
  9. mysql表误删回复_mysql 找回误删表的数据方法(必看)
  10. 头条python面试题_大意了,这几道Python面试题没有答对,Python面试题精选