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 相关文章推荐
Prototype PeriodicalExecuter对象 学习
Jul 19 Javascript
JS 遮照层实现代码
Mar 31 Javascript
JavaScript中为元素加上name属性的方法
May 09 Javascript
Javascript 鼠标移动上去 滑块跟随效果代码分享
Nov 23 Javascript
Jquery 实现table样式的设定
Jan 28 Javascript
springMVC结合AjaxForm上传文件
Jul 12 Javascript
javascript基础练习之翻转字符串与回文
Feb 20 Javascript
基于JavaScript定位当前的地理位置
Apr 11 Javascript
Angular实现响应式表单
Aug 04 Javascript
一步步教你利用Docker设置Node.js
Nov 20 Javascript
bootstrap table实现横向合并与纵向合并
Jul 18 Javascript
原生js实现ajax请求和JSONP跨域请求操作示例
Mar 14 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
php file_get_contents取文件中数组元素的方法
2017/04/01 PHP
用PHP去掉文件头的Unicode签名(BOM)方法
2017/06/22 PHP
yii2 上传图片的示例代码
2018/11/02 PHP
实例讲解PHP中使用命名空间
2019/01/27 PHP
php生成随机数/生成随机字符串的方法小结【5种方法】
2020/05/27 PHP
Javascript 垃圾收集机制介绍理解
2013/05/14 Javascript
表单元素与非表单元素刷新区别详细解析
2013/11/06 Javascript
50 个 jQuery 插件可将你的网站带到另外一个高度
2016/04/26 Javascript
jquery基本选择器匹配多个元素的实现方法
2016/09/05 Javascript
完美的js图片轮换效果
2017/02/05 Javascript
JS实现评价的星星功能
2017/08/20 Javascript
ES6 javascript中Class类继承用法实例详解
2017/10/30 Javascript
使用jQuery 操作table 完成单元格合并的实例
2017/12/27 jQuery
vuex 使用文档小结篇
2018/01/11 Javascript
vue实现图片滚动的示例代码(类似走马灯效果)
2018/03/03 Javascript
nodejs实现一个word文档解析器思路详解
2018/08/14 NodeJs
简单介绍Python中的floor()方法
2015/05/15 Python
Python使用Scrapy爬取妹子图
2015/05/28 Python
详解python基础之while循环及if判断
2017/08/24 Python
Python字典循环添加一键多值的用法实例
2019/01/20 Python
python3使用QQ邮箱发送邮件
2020/05/20 Python
python3 小数位的四舍五入(用两种方法解决round 遇5不进)
2019/04/11 Python
Python语言进阶知识点总结
2019/05/28 Python
Python+OpenCV+pyQt5录制双目摄像头视频的实例
2019/06/28 Python
python代码 FTP备份交换机配置脚本实例解析
2019/08/01 Python
Python socket模块方法实现详解
2019/11/05 Python
torch 中各种图像格式转换的实现方法
2019/12/26 Python
基于python求两个列表的并集.交集.差集
2020/02/10 Python
python try...finally...的实现方法
2020/11/25 Python
联想哥伦比亚网上商城:Lenovo Colombia
2017/01/10 全球购物
新西兰网上购物,折扣店:BestDeals.co.nz
2019/03/20 全球购物
泰国Robinson百货官网:购买知名品牌的商品
2020/02/08 全球购物
JSF面试题:Jsf中的核心类用那些?有什么作用?LiftCycle六大生命周期是什么?
2014/07/17 面试题
六查六看六改心得体会
2014/10/14 职场文书
python使用pygame创建精灵Sprite
2021/04/06 Python
MySQL中EXPLAIN语句及用法
2022/05/20 MySQL