ES6知识点整理之Proxy的应用实例详解


Posted in Javascript onApril 16, 2019

本文实例讲述了ES6知识点整理之Proxy的应用。分享给大家供大家参考,具体如下:

Proxy 用于修改对象某些操作的默认行为,可以对外界的访问进行过滤和改写,其概念类似于元编程。

Proxy 让我们可以对任何对象的绝大部分行为进行监听和干涉,实现更多的自定义程序行为。在目标对象之前架设一层“拦截”,外界对该对象的访问,都必须先通过这层拦截。

目前【兼容性】存在一定的问题,目前在chrome和ff浏览器中的非严格模式下可用,一些先进的技术即使在目前不能广泛应用,但随着时间的流逝,都将会进入程序员日常的编程中。

注: 博客整理时间:2018-03-24 16:21:15

初识Proxy

var obj = {name:'Joh'};
var proxy = new Proxy(obj, {
 get (target, key) {
  return 'test1';
 },
 set (target, key, value) {
  target[key] = value
 }
});
console.log(proxy.name); // test1 进行get取值
proxy.name = 'test2'; // 进行set设置
console.log(obj.name); // test2

通过Proxy对象进行拦截target对象的属性

完整的使用Proxy进行设置, 获取,修改和删除的案例

var obj = {name:'Joh',group:'g1',_type:'student'};
var proxy = new Proxy(obj, {
 get (target, key) {
  if(key[0]!== '_') {
   // return Reflect.get(target,key); // 效果等同于下面的return语句
   return target[key];
  };
 },
 set (target, key, value) {
  if(key[0]!== '_') {
   // Reflect.set(target,key,value);
   return target[key] = value;
  }
 },
 deleteProperty(target, key) {
  // 业务逻辑
  if(key[0] !== '_') {
   // Reflect.deleteProperty(target, key);
   delete target[key];
  }
 }
});
console.log(proxy.name); // Joh
console.log(obj.name); // Joh
proxy.name = 'Lily'; // 在非严格模式下的赋值操作,严格模式将会报错
console.log(obj.name); // Lily
delete proxy.name; // 未能成功删除,因为上面内部有判断
console.log(obj.name); // undefined 成功删除
delete proxy.group;
console.log(obj.group); // undefined 成功删除
delete proxy._type;
console.log(obj._type); // student
proxy.color='red';
console.log(obj.color); // red

其中借助Reflect实现和直接实现的效果等同

通过has方法和in关键字进行拦截的示例:

var obj = {name:"Joh",_name:"Lily"};
var proxy = new Proxy(obj, {
 has(target, key) {
  if(key[0] === '_'){
   return false;
  } else {
   return key in target;
  }
 }
});
console.log('has name attr: ', 'name' in proxy); // has name attr: true
console.log('has _name attr: ', '_name' in proxy); // has _name attr: false

使用ownKeys方法与for-in遍历过滤符合特定规则属性的示例

var obj = {name:"Joh",_name:"Lily", age:10, group:"g1"};
var proxy = new Proxy(obj, {
 ownKeys (target) {
  return Reflect.ownKeys(target).filter(key => key[0] !== '_');
 }
});
for(var k in proxy) {
 console.log(k); // 分别输出 name age group 过滤了 _name
}

通过apply方法对函数调用的拦截

function test() {
 console.log('hello world');
}
var proxyFun = new Proxy(test,{
 apply(target,ctx,args) {
  console.log('proxy apply');
  return Reflect.apply(target,ctx,args);
 }
});
proxyFun(); // 分别输出 proxy apply 和 hello world
// proxyFun.apply(); // 同样,分别输出 proxy apply 和 hello world
// proxyFun.call(); // 同样,分别输出 proxy apply 和 hello world

通过construct方法对构造函数实例化的拦截

function User() {
 console.log('this is a contructor');
}
var ClassProxy = new Proxy(User, {
 construct(target,args) {
  console.log('proxy construct');
  return Reflect.construct(target,args);
 }
});
new ClassProxy(); // 分别输出 proxy construct 和 this is a contructor

更多关于JavaScript相关内容可查看本站专题:《javascript面向对象入门教程》、《JavaScript切换特效与技巧总结》、《JavaScript查找算法技巧总结》、《JavaScript错误与调试技巧总结》、《JavaScript数据结构与算法技巧总结》、《JavaScript遍历算法与技巧总结》及《JavaScript数学运算用法总结》

希望本文所述对大家JavaScript程序设计有所帮助。

Javascript 相关文章推荐
jQuery实现隔行背景色变色
Nov 24 Javascript
详解js跨域原理以及2种解决方案
Dec 09 Javascript
jQuery插件Validate实现自定义校验结果样式
Jan 18 Javascript
javascript创建cookie、读取cookie
Mar 31 Javascript
jQuery简单实现彩色云标签效果示例
Aug 01 Javascript
Sequelize中用group by进行分组聚合查询
Dec 12 Javascript
设置jquery UI 控件的大小方法
Dec 12 Javascript
jQuery实现页面倒计时并刷新效果
Mar 13 Javascript
bootstrap如何让dropdown menu按钮式下拉框长度一致
Apr 10 Javascript
jQuery中.attr()和.data()的区别分析
Sep 03 jQuery
详解vue2.0监听属性的使用心得及搭配计算属性的使用
Jul 18 Javascript
Echarts动态加载多条折线图的实现代码
May 24 Javascript
js实现删除li标签一行内容
Apr 16 #Javascript
js实现弹出框的拖拽效果实例代码详解
Apr 16 #Javascript
重学 JS:为啥 await 不能用在 forEach 中详解
Apr 15 #Javascript
你不知道的Vue技巧之--开发一个可以通过方法调用的组件(推荐)
Apr 15 #Javascript
详解JavaScript中的强制类型转换
Apr 15 #Javascript
一个小时快速搭建微信小程序的方法步骤
Apr 15 #Javascript
详解从0开始搭建微信小程序(前后端)的全过程
Apr 15 #Javascript
You might like
初学CAKEPHP 基础教程
2009/11/02 PHP
joomla内置的表单验证功能使用方法
2010/06/11 PHP
使用PHP如何实现高效安全的ftp服务器(二)
2015/12/30 PHP
WordPress开发中用于标题显示的相关函数使用解析
2016/01/07 PHP
判断ie的两种简单方法
2013/08/12 Javascript
js中call与apply的用法小结
2013/12/28 Javascript
jQuery中removeData()方法用法实例
2014/12/27 Javascript
js实现在网页上简单显示时间的方法
2015/03/02 Javascript
jQuery实现div横向拖拽排序的简单实例
2016/07/13 Javascript
jQuery Easyui datagrid连续发送两次请求问题
2016/12/13 Javascript
读Javascript高性能编程重点笔记
2016/12/21 Javascript
详解Python中的from..import绝对导入语句
2016/06/21 Python
Python3中使用urllib的方法详解(header,代理,超时,认证,异常处理)
2016/09/21 Python
python批量替换页眉页脚实例代码
2018/01/22 Python
TensorFlow平台下Python实现神经网络
2018/03/10 Python
浅析Python函数式编程
2018/10/06 Python
浅谈解除装饰器作用(python3新增)
2018/10/15 Python
python调用百度地图WEB服务API获取地点对应坐标值
2019/01/16 Python
python基础知识(一)变量与简单数据类型详解
2019/04/17 Python
python遍历文件目录、批量处理同类文件
2019/08/31 Python
Python GUI编程学习笔记之tkinter控件的介绍及基本使用方法详解
2020/03/30 Python
Pycharm安装python库的方法
2020/11/24 Python
使用CSS实现阅读进度条
2017/02/27 HTML / CSS
全球性的在线商店:Vogca
2019/05/10 全球购物
法国一家多品牌成衣精品中/高档商店:Graduate Store
2019/08/28 全球购物
投资建议书模板
2014/05/12 职场文书
篮球比赛口号
2014/06/10 职场文书
行风评议整改报告
2014/11/06 职场文书
2015年综治维稳工作总结
2015/04/07 职场文书
大学生读书笔记大全
2015/07/01 职场文书
2015年物流客服工作总结
2015/07/27 职场文书
投资入股协议书
2016/03/22 职场文书
2016年学校爱国卫生月活动总结
2016/04/06 职场文书
golang特有程序结构入门教程
2021/06/02 Python
使用Vue3+Vant组件实现App搜索历史记录功能(示例代码)
2021/06/09 Vue.js
排查Tomcat进程假死的问题
2022/05/06 Servers