ES6中Proxy代理用法实例浅析


Posted in Javascript onApril 06, 2017

本文实例讲述了ES6中Proxy代理用法。分享给大家供大家参考,具体如下:

ES6中提出了一个新的特性,就是proxy,用来拦截在一个对象上的指定操作。这个功能非常的有用。举一个例子来说:

var engineer = { name: 'Joe Sixpack', salary: 50 };
var interceptor = {
 set: function (receiver, property, value) {
  console.log(property, 'is changed to', value);
  receiver[property] = value;
 }
};
engineer = Proxy(engineer, interceptor);

engineer对象被代理Proxy构建的代理对象代替,传入Proxy的第二个参数是一个处理器函数,一个处理器函数有多种方法,如get、set等方法。这里的set方法能够拦截到那些在代理对象身上进行的所有的属性赋值操作。

当我们执行下面赋值:

engineer.salary = 60;

会触发处理器,输出信息:

salary is changed to 60

每当代理对象被赋值,处理器函数就会调用,这样就可以用来调试某些问题。

当然了,Proxy可不是仅仅为了调试而诞生的,如果你用过Sencha Touch 或者 AngularJS的话,就会发现这些框架都是类似数据模型绑定的功能。

笔者曾在Sencha Touch中用过代理,代码如下:

proxy:{//数据代理
//       type:'localstorage',
//       id:'bills',
    // limitParam:'limit',
    // pageParam:'page',
    //将用户代理改为sql,通过websql来解决localstorage的5MB存储上限的问题
    type:'sql',
    database:'myDB',
    table:'bill',
},
//filters:[{property:"kind",value:"无"}],//过滤属性
listeners:{
    removerecords:function(){
      console.log("数据被删除");
    },
    addrecords:function(){
      console.log("数据被追加");
    },
    updaterecord:function(){
      console.log("数据被修改");
    },
}

可以看到,它采用的是一种监听setter和getter的办法,而在Angular中采用的则是脏检测。。当我们有了Proxy后,对于简单的数据模型绑定就可以简化这些特定的检测方式了。

我们还可以使用proxy来实现多继承。众所周知,JavaScript中每个对象只能有一个直接的上层原型,从而无法实现多继承:

var foo = {
  foo: function () {
    console.log("foo")
  }
};
var bar = {
  bar: function () {
    console.log("bar")
  }
};
var sonOfFoo = Object.create(foo);
sonOfFoo.foo();   //"foo"
var sonOfBar = Object.create(bar);
sonOfBar.bar();   //"bar"
//怎么才能既有foo方法又有bar方法?

我们可以通过proxy中的get处理器来生成一个继承两个原型的代理对象:

sonOfFooBar = new Proxy({}, {
  get: function (target, name) {
    return target[name] || foo[name] || bar[name];
  }
})
sonOfFooBar.foo();  //"foo",有foo方法,继承自对象foo
sonOfFooBar.bar();  //"bar",也有bar方法,继承自对象bar

其还有很多应用场景,可以参考下面这篇文章:proxy

但是百度EFE团队给出的评价是该功能不能通过模拟实现,所以建议不要使用。所以还是值得观望一段时间的。

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

Javascript 相关文章推荐
图像替换新技术 状态域方法
Jan 28 Javascript
改进UCHOME的记录发布,增强可访问性用户体验
Jan 17 Javascript
整理Javascript函数学习笔记
Dec 01 Javascript
实践中学习AngularJS表单
Mar 21 Javascript
如何让一个json文件显示在表格里【实现代码】
May 09 Javascript
js删除局部变量的实现方法
Jun 25 Javascript
jQuery扩展+xml实现表单验证功能的方法
Dec 25 Javascript
JS对象是否拥有某属性如何判断
Feb 03 Javascript
angular2/ionic2 实现搜索结果中的搜索关键字高亮的示例
Aug 17 Javascript
又拍云 Node.js 实现文件上传、删除功能
Oct 28 Javascript
详解Vue iview IE浏览器不兼容报错(Iview Bable polyfill)
Jan 07 Javascript
Ant Design Vue table中列超长显示...并加提示语的实例
Oct 31 Javascript
ES6中Symbol类型用法实例详解
Apr 06 #Javascript
vue中mint-ui环境搭建详细介绍
Apr 06 #Javascript
B/S(Web)实时通讯解决方案分享
Apr 06 #Javascript
HTML中使背景图片自适应浏览器大小实例详解
Apr 06 #Javascript
ES6中的箭头函数实例详解
Apr 06 #Javascript
ES6字符串模板,剩余参数,默认参数功能与用法示例
Apr 06 #Javascript
详谈js遍历集合(Array,Map,Set)
Apr 06 #Javascript
You might like
中英文字符串翻转函数
2008/12/09 PHP
php使用标签替换的方式生成静态页面
2015/05/21 PHP
PHP中JSON的应用技巧
2015/10/10 PHP
php根据日期或时间戳获取星座信息和生肖等信息
2015/10/20 PHP
PHP程序员简单的开展服务治理架构操作详解(一)
2020/05/14 PHP
Javascript学习笔记1 数据类型
2010/01/11 Javascript
获取服务器传来的数据 用JS去空格的正则表达式
2012/03/26 Javascript
浅析offsetLeft,Left,clientLeft之间的区别
2013/11/30 Javascript
JavaScript中的object转换函数toString()与valueOf()介绍
2014/12/31 Javascript
jQuery实现Flash效果上下翻动的中英文导航菜单代码
2015/09/22 Javascript
Jquery检验手机号是否符合规则并根据手机号检测结果将提交按钮设为不同状态
2015/11/26 Javascript
JavaScript获取ul中li个数的方法
2017/02/13 Javascript
微信小程序 图片宽度自适应的实现
2017/04/06 Javascript
详解vue表单验证组件 v-verify-plugin
2017/04/19 Javascript
AngularJS解决ng-if中的ng-model值无效的问题
2017/06/21 Javascript
node.js学习之事件模块Events的使用示例
2017/09/28 Javascript
vue.js实现h5机器人聊天(测试版)
2020/07/16 Javascript
[56:12]LGD vs Optic Supermajor小组赛D组胜者组决赛 BO3 第一场 6.3
2018/06/04 DOTA
[15:07]lgd_OG_m2_BP
2019/09/10 DOTA
详解Python中使用base64模块来处理base64编码的方法
2016/07/01 Python
Python 列表中的修改、添加和删除元素的实现
2020/06/11 Python
python批量处理多DNS多域名的nslookup解析实现
2020/06/28 Python
详解CSS3选择器的使用方法汇总
2015/11/24 HTML / CSS
使用canvas生成含有微信头像的邀请海报没有微信头像问题
2019/10/29 HTML / CSS
领先的钻石和订婚戒指零售商:Diamonds-USA
2016/12/11 全球购物
德国前卫设计师时装在线商店:Luxury Loft
2019/11/04 全球购物
一些Solaris面试题
2013/03/22 面试题
教师演讲稿开场白
2014/08/25 职场文书
党的群众路线对照检查材料(个人)
2014/09/24 职场文书
2014年民政工作总结
2014/11/26 职场文书
毕业生自荐材料范文
2014/12/30 职场文书
2019客服个人年终工作总结范文
2019/07/08 职场文书
详解overflow:hidden的作用(溢出隐藏、清除浮动、解决外边距塌陷)
2021/07/01 HTML / CSS
交互式可视化js库gojs使用介绍及技巧
2022/02/18 Javascript
Python安装使用Scrapy框架
2022/04/12 Python
MySql如何将查询的出来的字段进行转换
2022/06/14 MySQL