proxy用法

// 代理
{
let obj={
time:'2017-03-11',
name:'net',
_r:
}; let monitor=new Proxy(obj,{
// 拦截对象属性的读取
get(target,key){
return target[key].replace('','') //将目标对象中的2017都换成2018
},
// 拦截对象设置属性
set(target,key,value){
if(key==='name'){
return target[key]=value; //当key值为name时会被修改value值
}else {
return target[key];
}
},
// 拦截key in object操作判断是否属于object的某个属性
has(target,key){
if(key==='name'){
return target[key]
}else {
return false;
}
},
// 拦截delete
deleteProperty(target,key){
if(key.indexOf('_') > -){
delete target[key];
return true;
}else {
return target[key]
}
},
// 保护属性 拦截Object.keys,Object.getOwnPropertySymbols,Object.getOwnPropertyNames
ownKeys(target){
return Object.keys(target).filter(item=>item!='time')
}
}); console.log('get',monitor.time); monitor.time='';
monitor.name='mukewan';
console.log('set',monitor.time,monitor); //set 2018-03-11 Proxy {time: "2017-03-11", name: "mukewan", _r: 123} console.log('has','name' in monitor,'time' in monitor); //true false // delete monitor.time;
// console.log('delete',monitor); //还是存在,没被删掉 // delete monitor.time;
// console.log('delete',monitor); // delete monitor._r这一项;
// console.log('delete',monitor); //发现被删除了_r这一项 console.log('ownKeys',Object.keys(monitor)); //["name", "_r"] time被保护
}

Reflect

Reflect用法跟Proxy一样,他有的方法他都有,使用起来更简单

{
let obj={
time:'2017-03-11',
name:'net',
_r:
};
console.log('Reflect get',Reflect.get(obj,'time'));
Reflect.set(obj,'name','mukewan');
console.log(obj);
console.log('has',Reflect.has(obj,'name'));
}

应用场景 数据校验

{
function validator(target,validator){
return new Proxy(target,{
_validator:validator,
set(target,key,value,proxy){
if (target,key,value,proxy) {
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>
},
mobile(val) { }
} class Person {
constructor(name,age){
this.name=name;
this.age=age;
return validator(this,personValidators)
}
} const person=new Person('lilei',);
console.log(person);
person.name='Han mei mei'; console.log(person);
}

ES6学习笔记三(proxy和reflect)的更多相关文章

  1. ES6学习笔记<三> 生成器函数与yield

    为什么要把这个内容拿出来单独做一篇学习笔记? 生成器函数比较重要,相对不是很容易理解,单独做一篇笔记详细聊一聊生成器函数. 标题为什么是生成器函数与yield? 生成器函数类似其他服务器端语音中的接口 ...

  2. ES6学习笔记(11)----Proxy

    参考书<ECMAScript 6入门>http://es6.ruanyifeng.com/ Proxy1.概述    Proxy可以用来修改对象的默认操作    let obj = {na ...

  3. ES6学习笔记三:Symbol、Set、Map

    一:Symbol ES6 引入了一种新的原始数据类型Symbol,表示独一无二的值.它是 JavaScript 语言的第七种数据类型,前六种是:undefined.null.布尔值(Boolean). ...

  4. ES6学习笔记(三)——数值的扩展

    看到这条条目录有没有感觉很枯燥,觉得自己的工作中还用不到它所以实在没有耐心看下去,我也是最近得闲,逼自己静下心来去学习去总结,只有在别人浮躁的时候你能静下心来去学去看去总结,你才能进步.毕竟作为前端不 ...

  5. ES6学习笔记三

    1.Symbol ES5 的对象属性名都是字符串,这容易造成属性名的冲突.如果有一种机制,保证每个属性的名字都是独一无二的就好了,这样就从根本上防止属性名的冲突.这就是 ES6 引入Symbol的原因 ...

  6. ES6学习笔记<五> Module的操作——import、export、as

    import export 这两个家伙对应的就是es6自己的 module功能. 我们之前写的Javascript一直都没有模块化的体系,无法将一个庞大的js工程拆分成一个个功能相对独立但相互依赖的小 ...

  7. ES6学习笔记<四> default、rest、Multi-line Strings

    default 参数默认值 在实际开发 有时需要给一些参数默认值. 在ES6之前一般都这么处理参数默认值 function add(val_1,val_2){ val_1 = val_1 || 10; ...

  8. ES6学习笔记<二>arrow functions 箭头函数、template string、destructuring

    接着上一篇的说. arrow functions 箭头函数 => 更便捷的函数声明 document.getElementById("click_1").onclick = ...

  9. ES6学习笔记<一> let const class extends super

    学习参考地址1  学习参考地址2 ECMAScript 6(以下简称ES6)是JavaScript语言的下一代标准.因为当前版本的ES6是在2015年发布的,所以又称ECMAScript 2015:也 ...

随机推荐

  1. Linux系统IO分析工具之iotop常用参数介绍

      Linux系统IO分析工具之iotop常用参数介绍 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 在一般运维工作中经常会遇到这么一个场景,服务器的IO负载很高(iostat中的 ...

  2. CodeForces - 375A Divisible by Seven(数学)

    https://vjudge.net/problem/48715/origin 题意:给出必定含1689四个数字的字符串,随意交换位置构造出能被7整除的数. 分析:数学思维题.观察发现1689的排列与 ...

  3. @CrossOrigin注解与跨域访问

    在Controller中看到@CrossOrigin ,这是什么?有什么用?为什么要用? what? @CrossOrigin是用来处理跨域请求的注解 先来说一下什么是跨域: (站在巨人的肩膀上) 跨 ...

  4. git个人学习总结

    什么是git 代码管理工具,分布式管理,每个人电脑都是一个完整的版本库.并且有中央服务器(gitHub,gitLab)提供代码交换修改 git基础概念 工作区:自己的项目(有一个隐藏目录 " ...

  5. python实现单向循环链表

    单向循环链表 单链表的一个变形是单向循环链表,链表中最后一个节点的next域不再为None,而是指向链表的头节点. 实现 class Node(object): """节 ...

  6. Hadoop 博文整理

    参考文章##搭建 使用yum安装CDH Hadoop集群   http://blog.javachen.com/2013/04/06/install-cloudera-cdh-by-yum/   Ha ...

  7. 三.HashMap原理及实现学习总结

    HashMap是Java中最常用的集合类框架之一,是Java语言中非常典型的数据结构.本篇主要是从HashMap的工作原理,数据结构分析,HashMap存储和读取几个方面对其进行学习总结.关于Hash ...

  8. ****** 三十 ******、软设笔记【计算机体系结构】-循环冗余校验码(CRC)

    循环冗余校验码(CRC)  广泛地在网络通信及磁盘存储时采用.  1.多项式  在循环冗余校验(CRC)码中,无一例外地要提到多项式的概念.一个二进制数可以以一个多项式来表示.如1011表示为多项式X ...

  9. 十一、移植优化---CONFIG 优化进 menuconfig(1)

    在移植 JZ2440 中,include/configs/jz2440.h 中有很多config 项都是已经在 uboot 的主配置中已经存在了的,这些配置造成了重复,需要优化. 先将原先的 smdk ...

  10. 20155324 2016-2017-2 《Java程序设计》第3周学习总结

    20155324 2016-2017-2 <Java程序设计>第3周学习总结 教材学习内容总结 定义类 要产生对象必须先定义类,类是对象的设计图,对象是类的实例.类定义时使用class关键 ...