详解es6中Proxy代理对象的作用
在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里面做更多逻辑的处理等等
最新文章
- [LeetCode] Divide Two Integers 两数相除
- 1.2、Workspace中让Package分层显示
- css display:inline-block 出现空格解决方案
- C# 时间函数相减
- Java代码简化神器-Lombok
- SonarLint插件的安装与使用
- Windows Server 2012学习文档
- 2.C#基础篇-->;数据类型
- cocos2dx addchild坐标问题
- Touch事件or手机卫士面试题整理回答(二)
- YesNo列
- JAVA 调用mysql存储过程
- web.xml is missing and <;failOnMissingWebXml>; is set to true
- WebStorm重复代码快捷表达
- 爬虫(七)图片懒加载技术、selenium和PhantomJS
- SpringSecurity身份验证基础入门
- HTML(二)
- docker 安装mysql示例
- Orchard Core 增加了一个API模块,要怎么调用
- java swing 制作一个登陆界面,亲测有效
热门文章
- java spring事务管理相关
- VMware中 CentOs虚拟机的安装教程
- Flink SQL项目实录
- 学习笔记:oracle学习一:oracle11g体系结构之服务器结构、数据字典
- [ReferenceError: __insane_exports is not defined] [monaco-editor@0.18.0] [vue] [typescript]
- Redis 常用命令学习二:字符串类型命令
- 什么是SSH 以及常见的ssh 功能
- Feign【首次请求失败】
- Thinking In Java 4th Chap6 访问权限控制
- Luogu5284 十二省联考2019字符串问题(后缀树+拓扑排序)