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 相关文章推荐
精解window.setTimeout()&window.setInterval()使用方式与参数传递问题!
Nov 23 Javascript
JavaScript中圆括号()和方括号[]的特殊用法疑问解答
Aug 06 Javascript
JS实现往下不断流动网页背景的方法
Feb 27 Javascript
JavaScript仿支付宝密码输入框
Dec 29 Javascript
JSON格式的时间/Date(2367828670431)/格式转为正常的年-月-日 格式的代码
Jul 27 Javascript
vue动态生成dom并且自动绑定事件
Apr 19 Javascript
JavaScript门面模式详解
Oct 19 Javascript
vue实现密码显示隐藏切换功能
Feb 23 Javascript
Vue render深入开发讲解
Apr 13 Javascript
详解基于mpvue的小程序markdown适配解决方案
May 08 Javascript
微信小程序实现锚点功能
Nov 20 Javascript
Vue常用传值方式、父传子、子传父及非父子实例分析
Feb 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
提升PHP执行速度全攻略(上)
2006/10/09 PHP
用DBSQL类加快开发MySQL数据库程序的速度
2006/10/09 PHP
php中变量及部分适用方法
2008/03/27 PHP
探讨fckeditor在Php中的配置详解
2013/06/08 PHP
在PHP上显示JFreechart画的统计图方法
2013/11/03 PHP
PHP采用curl模仿用户登陆新浪微博发微博的方法
2014/11/07 PHP
PHP实现的简单三角形、矩形周长面积计算器分享
2014/11/18 PHP
PHP获取数组最大值下标的方法
2015/05/12 PHP
PHP IDE PHPStorm配置支持友好Laravel代码提示方法
2015/05/12 PHP
用jQuery实现检测浏览器及版本的脚本代码
2008/01/22 Javascript
Extjs Ajax 乱码问题解决方案
2009/04/15 Javascript
在Javascript中 声明时用"var"与不用"var"的区别
2013/04/15 Javascript
Jquery Validate 正则表达式实用验证代码大全
2013/08/23 Javascript
jQuery处理xml格式的返回数据(实例解析)
2013/11/28 Javascript
浅谈Node.js:fs文件系统模块
2016/12/08 Javascript
js时间戳和c#时间戳互转方法(推荐)
2017/02/15 Javascript
JS实现根据密码长度显示安全条功能
2017/03/08 Javascript
实例详解JavaScript中setTimeout函数的执行顺序
2017/07/12 Javascript
使用react-router4.0实现重定向和404功能的方法
2017/08/28 Javascript
基于vue+canvas的excel-like组件实例详解
2017/11/28 Javascript
解决Angular.js中使用Swiper插件不能滑动的问题
2018/02/26 Javascript
[51:26]VP vs VG 2018国际邀请赛小组赛BO2 第二场 8.19
2018/08/21 DOTA
用python做一个搜索引擎(Pylucene)的实例代码
2017/07/05 Python
python opencv设置摄像头分辨率以及各个参数的方法
2018/04/02 Python
Python人脸识别第三方库face_recognition接口说明文档
2019/05/03 Python
详解Django3中直接添加Websockets方式
2020/02/12 Python
Python多进程编程multiprocessing代码实例
2020/03/12 Python
Pytorch 卷积中的 Input Shape用法
2020/06/29 Python
中国跨境海淘网站:考拉海购
2016/08/01 全球购物
美国LOGO设计公司:The Logo Company
2018/07/16 全球购物
PHP如何删除一个Cookie值
2012/11/15 面试题
cf收人广告词
2014/03/14 职场文书
学术研讨会欢迎词
2015/01/26 职场文书
2015年客房服务员工作总结
2015/05/15 职场文书
2015秋学期开学寄语
2015/05/28 职场文书
go web 预防跨站脚本的实现方式
2021/06/11 Golang