在es6中新添加了Proxy,那么它有什么作用啊?Proxy本意为代理,而es6中的Proxy也就是代理对象,那么代理对象感觉听起来很模糊,在这里就解释一下Proxy代理对象的作用。

Proxy的主要作用就是可以对 对象进行拦截,以及对数据读取、修改的过滤保护。

我们先利用es3的方式来实现一个需求,现有一数据,内部有name、age、sex三个属性,name、age属性可读可写,但是sex属性只可读,不可写

分析步骤:

我们可以定义一个构造函数,内部定义一个data数据,包含这三个属性

我们还要暴露两个方法,一个get,一个set

get用来读数据,set用来写数据,在写数据的时候判断,如果想设置sex这个属性,我们就给错误提示

 var Person = function(){
var data = {
name:'monkey',
age:18,
sex:'男'
}
this.get = function(key){
console.log(key)
return data[key]
}
this.set = function(key,value){
if(key!=='sex'){
return data[key] = value
}else{
throw '该属性为只读属性'
}
}
}
var person = new Person;
var name = person.get('name')
person.set('sex','女')
console.log(person.get('sex'))

  

最终输出结果:

我们就实现了,name可读可写,sex却不能修改

然后我们再利用es5的方式来实现,es5知道defineProperty这个方法的实现就简单很多了

var person = {
name:'monkey',
age:30
}
Object.defineProperty(person,'sex',{
writable:false,
value:'男'
})
person.sex = '女'
console.log(person.sex)

  

我们通过defineProperty设置sex属性为不可写属性


我们会发现最终结果还是男并没有修改成功

接下来我们就再利用es6的Proxy来实现

var person = {
name:'monkey',
age:19,
sex:'男'
}
var p1 = new Proxy(person,{
get(target,key){
console.log(target)
console.log(key)
return target[key]
},
set(target,key,value){
if(key=='sex'){
throw '不允许修改sex'
}else{
target[key] = value
}
}
})
p1.name
p1.sex = '女'

  

我们来分析下上面的代码,

定义了一个person数据

通过new Proxy得到代理对象p1

Proxy第一个参数为要拦截的对象,第二个参数为对象,对象内部有get和set方法

get方法是通过p1读数据的时候会调用,get方法有两个参数,target为目标数据也就是person,key就是通过p1读数据时候的key
例如上面代码20行读取数据了,就会触发get方法结果如下

set方法就是当通过p1设置数据的时候会触发,内部有三个形参,第一个还是target,第二个还是key,第三个为value也就是设置的值

那么我们就可以通过key来判断,如果key为sex就代表你要设置sex就给错误提示

否则就通过target[key] = value给设置数据

以上就是Proxy的使用方法了,相对es3和es5而言Proxy感觉还是很好的,因为可以在set里面做更多逻辑的处理等等

最新文章

  1. [LeetCode] Divide Two Integers 两数相除
  2. 1.2、Workspace中让Package分层显示
  3. css display:inline-block 出现空格解决方案
  4. C# 时间函数相减
  5. Java代码简化神器-Lombok
  6. SonarLint插件的安装与使用
  7. Windows Server 2012学习文档
  8. 2.C#基础篇-->数据类型
  9. cocos2dx addchild坐标问题
  10. Touch事件or手机卫士面试题整理回答(二)
  11. YesNo列
  12. JAVA 调用mysql存储过程
  13. web.xml is missing and <failOnMissingWebXml> is set to true
  14. WebStorm重复代码快捷表达
  15. 爬虫(七)图片懒加载技术、selenium和PhantomJS
  16. SpringSecurity身份验证基础入门
  17. HTML(二)
  18. docker 安装mysql示例
  19. Orchard Core 增加了一个API模块,要怎么调用
  20. java swing 制作一个登陆界面,亲测有效

热门文章

  1. java spring事务管理相关
  2. VMware中 CentOs虚拟机的安装教程
  3. Flink SQL项目实录
  4. 学习笔记:oracle学习一:oracle11g体系结构之服务器结构、数据字典
  5. [ReferenceError: __insane_exports is not defined] [monaco-editor@0.18.0] [vue] [typescript]
  6. Redis 常用命令学习二:字符串类型命令
  7. 什么是SSH 以及常见的ssh 功能
  8. Feign【首次请求失败】
  9. Thinking In Java 4th Chap6 访问权限控制
  10. Luogu5284 十二省联考2019字符串问题(后缀树+拓扑排序)