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 相关文章推荐
javascript实现十六进制颜色值(HEX)和RGB格式相互转换
Jun 20 Javascript
Jquery对象和Dom对象的区别分析
Nov 20 Javascript
jQuery实现checkbox全选的方法
Jun 10 Javascript
jQuery 如何给Carousel插件添加新的功能
Apr 18 Javascript
JavaScript程序中的流程控制语句用法总结
May 23 Javascript
javascript实现根据汉字获取简拼
Sep 25 Javascript
js实现可输入可选择的select下拉框
Dec 21 Javascript
angular5 httpclient的示例实战
Mar 12 Javascript
JS实现字符串中去除指定子字符串方法分析
May 17 Javascript
浅谈vue异步数据影响页面渲染
Oct 29 Javascript
原生小程序封装跑马灯效果
Oct 21 Javascript
JavaScript点击按钮生成4位随机验证码
Jan 28 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
ThinkPHP采用模块和操作分析
2011/04/18 PHP
php网上商城购物车设计代码分享
2012/02/15 PHP
php实现cc攻击防御和防止快速刷新页面示例
2014/02/13 PHP
PHP中遇到BOM、编码导致json_decode函数无法解析问题
2014/07/02 PHP
PHP PDOStatement::setAttribute讲解
2019/02/01 PHP
PHP中str_split()函数的用法讲解
2019/04/11 PHP
Laravel框架Blade模板简介及模板继承用法分析
2019/12/03 PHP
用ADODB.Stream转换
2007/01/22 Javascript
jQuery 技巧大全(新手入门篇)
2009/05/12 Javascript
JavaScript 异步方法队列链实现代码分析
2010/06/05 Javascript
jQuery powerFloat万能浮动层下拉层插件使用介绍
2010/12/27 Javascript
JavaScript 上万关键字瞬间匹配实现代码
2013/07/07 Javascript
JS比较两个时间大小的简单示例代码
2013/12/20 Javascript
JS 仿腾讯发表微博的效果代码
2013/12/25 Javascript
javascript高级编程之函数表达式 递归和闭包函数
2015/11/29 Javascript
JavaScript中数组添加值和访问值常见问题
2016/02/06 Javascript
jquery-mobile表单的创建方法详解
2016/11/23 Javascript
jquery UI Datepicker时间控件冲突问题解决
2016/12/16 Javascript
详解RequireJS按需加载样式文件
2017/04/12 Javascript
Vue.js实现大转盘抽奖总结及实现思路
2019/10/09 Javascript
uin-app+mockjs实现本地数据模拟
2020/08/26 Javascript
Python和C/C++交互的几种方法总结
2017/05/11 Python
python微信跳一跳系列之棋子定位颜色识别
2018/02/26 Python
利用Python实现在同一网络中的本地文件共享方法
2018/06/04 Python
Python多进程方式抓取基金网站内容的方法分析
2019/06/03 Python
python实现接口并发测试脚本
2019/06/25 Python
在linux下实现 python 监控usb设备信号
2019/07/03 Python
使用pygame写一个古诗词填空通关游戏
2019/12/03 Python
python urllib和urllib3知识点总结
2021/02/08 Python
省级四好少年事迹材料
2014/01/25 职场文书
新闻传播专业求职信
2014/07/22 职场文书
企业与个人合作经营协议书
2014/11/01 职场文书
2015最新婚礼司仪主持词
2015/06/30 职场文书
宿舍管理制度范本
2015/08/07 职场文书
Nginx Rewrite使用场景及配置方法解析
2021/04/01 Servers
详解Java线程池是如何重复利用空闲线程的
2021/06/26 Java/Android