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 相关文章推荐
浅析jQuery1.8的几个小变化
Dec 10 Javascript
使用text方法获取Html元素文本信息示例
Sep 01 Javascript
基于jquery实现即时检查格式是否正确的表单
May 06 Javascript
JS组件Bootstrap Table布局详解
May 27 Javascript
浅谈js对象的创建和对6种继承模式的理解和遐想
Oct 16 Javascript
详解JavaScript常量定义
Jan 03 Javascript
Element-ui table中过滤条件变更表格内容的方法
Mar 02 Javascript
node.js express框架简介与实现
Jul 23 Javascript
layui 关闭open弹出框 刷新table表格页面的方法
Sep 16 Javascript
JS自定义对象创建与简单使用方法示例
Jan 15 Javascript
AI小程序之语音听写来了,十分钟掌握百度大脑语音听写全攻略
Mar 13 Javascript
JavaScript交换变量常用4种方法解析
Sep 02 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
IIS6.0 开启Gzip方法及PHP Gzip函数分享
2014/06/08 PHP
在Yii框架中使用PHP模板引擎Twig的例子
2014/06/13 PHP
全新Mac配置PHP开发环境教程
2016/02/03 PHP
ecshop添加菜单及权限分配问题
2017/11/21 PHP
使用按钮控制以何种方式打开新窗口的属性介绍
2012/12/17 Javascript
js 获取坐标 通过JS得到当前焦点(鼠标)的坐标属性
2013/01/04 Javascript
node.js中的fs.readFileSync方法使用说明
2014/12/15 Javascript
JavaScript:Date类型全面解析
2016/05/19 Javascript
js实现加载更多功能实例
2016/10/27 Javascript
Bootstrap 下拉多选框插件Bootstrap Multiselect
2017/01/22 Javascript
vue+vue-validator 表单验证功能的实现代码
2017/11/13 Javascript
Node.js笔记之process模块解读
2018/05/31 Javascript
d3绘制基本的柱形图的实现代码
2018/12/12 Javascript
详解微信小程序获取当前时间及日期的方法
2019/04/28 Javascript
JavaScript实现美化滑块效果
2019/05/17 Javascript
vue分页器组件编写方法详解
2019/06/28 Javascript
vue实现element表格里表头信息提示功能(推荐)
2019/11/20 Javascript
JS函数进阶之继承用法实例分析
2020/01/15 Javascript
微信小程序实现点击页面出现文字
2020/09/21 Javascript
[46:21]Liquid vs LGD 2018国际邀请赛淘汰赛BO3 第一场 8.23
2018/08/24 DOTA
python使用三角迭代计算圆周率PI的方法
2015/03/20 Python
python使用urllib2提交http post请求的方法
2015/05/26 Python
Django中间件实现拦截器的方法
2018/06/01 Python
Win10下python3.5和python2.7环境变量配置教程
2018/09/18 Python
python实现自动登录后台管理系统
2018/10/18 Python
Django工程的分层结构详解
2019/07/18 Python
python 装饰器的实际作用有哪些
2020/09/07 Python
pandas处理csv文件的方法步骤
2020/10/16 Python
css3 实现滚动条美化效果的实例代码
2021/01/06 HTML / CSS
2014年中班元旦活动方案
2014/02/14 职场文书
大学生职业生涯规划书参考模板
2014/03/05 职场文书
汽车维修求职信
2014/06/15 职场文书
领导欢送会主持词
2015/07/06 职场文书
《认识年月日》教学反思
2016/02/19 职场文书
mysql字符串截取函数小结
2021/04/05 MySQL
vue使用echarts实现折线图
2022/03/21 Vue.js