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 相关文章推荐
Code:findPosX 和 findPosY
Dec 20 Javascript
JavaScript入门教程(9) Document文档对象
Jan 31 Javascript
Javascript代码在页面加载时的执行顺序介绍
May 03 Javascript
21个值得收藏的Javascript技巧
Feb 04 Javascript
AngularJS 让人爱不释手的八种功能
Mar 23 Javascript
BooStrap对导航条的改造实践小结
Sep 21 Javascript
jQuery中Chosen三级联动功能实例代码
Mar 07 Javascript
Node.js中看JavaScript的引用
Apr 22 Javascript
不使用 JS 匿名函数理由
Nov 17 Javascript
vue实现弹框遮罩点击其他区域弹框关闭及v-if与v-show的区别介绍
Sep 29 Javascript
如何配置vue.config.js 处理static文件夹下的静态文件
Jun 19 Javascript
Vue全局事件总线你了解吗
Feb 24 Vue.js
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/12/06 PHP
php时区转换转换函数
2014/01/07 PHP
PHP strip_tags() 去字符串中的 HTML、XML 以及 PHP 标签的函数
2016/05/22 PHP
Laravel 中创建 Zip 压缩文件并提供下载的实现方法
2019/04/02 PHP
javascript打印输出json实例
2013/11/11 Javascript
jQuery学习笔记之jQuery.extend(),jQuery.fn.extend()分析
2014/06/09 Javascript
new Date()问题在ie8下面的处理方法
2014/07/31 Javascript
jquery实现拖拽调整Div大小
2015/01/30 Javascript
jquery实现表单验证并阻止非法提交
2015/07/09 Javascript
js判断复选框是否选中及选中个数的实现代码
2016/05/30 Javascript
xtemplate node.js 的使用方法实例解析
2016/08/22 Javascript
JavaScript实现图片懒加载(Lazyload)
2016/11/28 Javascript
vue自动化表单实例分析
2018/05/06 Javascript
详解无限滚动插件vue-infinite-scroll源码解析
2019/05/12 Javascript
js使用cookie实现记住用户名功能示例
2019/06/13 Javascript
JS中的算法与数据结构之字典(Dictionary)实例详解
2019/08/20 Javascript
vue实现将数据存入vuex中以及从vuex中取出数据
2019/11/08 Javascript
Vue实例的对象参数options的几个常用选项详解
2019/11/08 Javascript
python通过装饰器检查函数参数数据类型的方法
2015/03/13 Python
编写Python脚本把sqlAlchemy对象转换成dict的教程
2015/05/29 Python
python计算auc指标实例
2017/07/13 Python
Flask解决跨域的问题示例代码
2018/02/12 Python
Python callable()函数用法实例分析
2018/03/17 Python
python3转换code128条形码的方法
2019/04/17 Python
python多任务之协程的使用详解
2019/08/26 Python
numpy 声明空数组详解
2019/12/05 Python
Nike比利时官网:Nike.com (BE)
2019/02/07 全球购物
Microsoft Advertising美国:微软搜索广告
2019/05/01 全球购物
巴西最大的巴士票务门户:Quero Passagem
2020/11/21 全球购物
Kingsoft金山公司C/C++笔试题
2016/05/10 面试题
托管代码(Managed Code)和非托管代码(Unmanaged Code)有什么区别
2014/09/29 面试题
优秀共产党员先进事迹
2014/01/27 职场文书
数字化校园建设方案
2014/05/03 职场文书
经营管理策划方案
2014/05/22 职场文书
医生见习报告范文
2014/11/03 职场文书
在js中修改html body的样式
2021/11/11 Javascript