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当onmousedown、onmouseup、onclick同时应用于同一个标签节点Element
Jan 05 Javascript
解决3.01版的jquery.form.js中文乱码问题的解决方法
Mar 08 Javascript
javascript-简单的计算器实现步骤分解(附图)
May 30 Javascript
jquery无刷新验证邮箱地址实现实例
Feb 19 Javascript
深入剖析JavaScript中的枚举功能
Mar 06 Javascript
js不能获取隐藏的div的宽度只能先显示后获取
Sep 04 Javascript
javascript中hasOwnProperty() 方法使用指南
Mar 09 Javascript
跟我学习javascript的for循环和for...in循环
Nov 18 Javascript
JavaScript实现仿淘宝商品购买数量的增减效果
Jan 22 Javascript
JS字符串去除连续或全部重复字符的实例
Mar 08 Javascript
从0到1学习JavaScript编写贪吃蛇游戏
Jul 28 Javascript
vue页面引入three.js实现3d动画场景操作
Aug 10 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
蝙蝠侠:侠影之谜
2020/03/04 欧美动漫
电脑硬件及电脑配置知识大全
2020/03/17 数码科技
PHP中替换键名的简易方法示例详解
2014/01/07 PHP
PHP学习记录之常用的魔术常量详解
2019/12/12 PHP
jQuery 使用个人心得
2009/02/26 Javascript
CSS+Jquery实现页面圆角框方法大全
2009/12/24 Javascript
仅IE6/7/8中innerHTML返回值忽略英文空格的问题
2011/04/07 Javascript
node.js中的events.emitter.removeAllListeners方法使用说明
2014/12/10 Javascript
jQuery实现右侧显示可向左滑动展示的深色QQ客服效果代码
2015/10/23 Javascript
JavaScript中点击事件的写法
2016/06/28 Javascript
基于js实现checkbox批量选中操作
2016/11/22 Javascript
Radio 单选JS动态添加的选项onchange事件无效的解决方法
2016/12/12 Javascript
vue2.0 + element UI 中 el-table 数据导出Excel的方法
2018/03/02 Javascript
vue用Object.defineProperty手写一个简单的双向绑定的示例
2018/07/09 Javascript
微信小程序利用Canvas绘制图片和竖排文字详解
2019/06/25 Javascript
VUE 解决mode为history页面为空白的问题
2019/11/01 Javascript
解决vue-router 切换tab标签关闭时缓存问题
2020/07/22 Javascript
Vue双向数据绑定(MVVM)的原理
2020/10/03 Javascript
[01:10]为家乡而战!完美世界城市挑战赛全国总决赛花絮
2019/07/25 DOTA
详解Django框架中的视图级缓存
2015/07/23 Python
Python判断两个对象相等的原理
2017/12/12 Python
python版学生管理系统
2018/01/10 Python
python/sympy求解矩阵方程的方法
2018/11/08 Python
pyinstaller参数介绍以及总结详解
2019/07/12 Python
python 删除excel表格重复行,数据预处理操作
2020/07/06 Python
Python实现壁纸下载与轮换
2020/10/19 Python
python 实现控制鼠标键盘
2020/11/27 Python
pandas map(),apply(),applymap()区别解析
2021/02/24 Python
使用canvas生成含有微信头像的邀请海报没有微信头像问题
2019/10/29 HTML / CSS
市三好学生主要事迹
2014/01/28 职场文书
残疾人创业典型事迹
2014/02/01 职场文书
计算机系本科生求职信
2014/05/31 职场文书
道德模范事迹材料
2014/12/20 职场文书
北大自主招生自荐信
2015/03/04 职场文书
html5 录制mp3音频支持采样率和比特率设置
2021/07/15 Javascript
JavaScript展开运算符和剩余运算符的区别详解
2022/02/18 Javascript