javascript观察者模式实现自动刷新效果


Posted in Javascript onSeptember 05, 2017

本文实例为大家分享了js观察者模式实现自动刷新的具体代码,供大家参考,具体内容如下

// author wangbinandi@gmail.com

const observable = obj => {
  const observers = Symbol();
  const set = function(target, key, value) {
    const result = Reflect.set(target, key, value);
    //console.log("set key:" + key);
    if ( target[observers].has(key) ) {
      target[observers].get(key).forEach(observer => observer());
    }

    return result;
  }

  const get = function(target, key) {
    const result = Reflect.get(target, key);
    //console.log("get key:" + key);
    if (arguments.callee.caller) {
      if (!target[observers].has(key)) {
        target[observers].set(key, new Set())
      }
      target[observers].get(key).add(arguments.callee.caller);
    }

    return result;
  }

  obj[observers] = new Map(); // string => Set()
  return new Proxy(obj, {set, get});
};

const autorun = fn => fn();

var person = observable({
  firstName: 'Matt',
  lastName: 'Ruby',
  age: 18,
  weight: 50
});

autorun(function () {
  console.log('autorun.getAge: ' + person.firstName + ' ' + person.age);
});

autorun(function () {
  console.log('autorun.getName: ' + person.firstName + ' ' + person.lastName);
});

person.age = 19;
person.weight = 55;
person.firstName = 'test';
person.lastName = 'MyLast';
console.log(person.lastName);
person.age = 20;

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
JQuery,Extjs,YUI,Prototype,Dojo 等JS框架的区别和应用场景简述
Apr 15 Javascript
jQuery EasyUI NumberBox(数字框)的用法
Jul 08 Javascript
Firefox/Chrome/Safari的中可直接使用$/$$函数进行调试
Feb 13 Javascript
打印json对象的内容及JSON.stringify函数应用
Mar 29 Javascript
理解JAVASCRIPT中hasOwnProperty()的作用
Jun 05 Javascript
模拟jQuery中的ready方法及实现按需加载css,js实例代码
Sep 27 Javascript
javascript动态的改变IFrame的高度实现自动伸展
Oct 12 Javascript
js统计录入文本框中字符的个数并加以限制不超过多少
May 23 Javascript
深入理解jQuery.data() 的实现方式
Nov 30 Javascript
vue一个页面实现音乐播放器的示例
Feb 06 Javascript
纯javascript前端实现base64图片下载(兼容IE10+)
Sep 14 Javascript
webpack自动打包和热更新的实现方法
Jun 24 Javascript
js使用generator函数同步执行ajax任务
Sep 05 #Javascript
vue如何使用 Slot 分发内容实例详解
Sep 05 #Javascript
详解Vue2.0 事件派发与接收
Sep 05 #Javascript
JavaSctit 利用FileReader和滤镜上传图片预览功能
Sep 05 #Javascript
jQuery实现注册会员时密码强度提示信息功能示例
Sep 05 #jQuery
JSON在Javascript中的使用(eval和JSON.parse的区别)详细解析
Sep 05 #Javascript
详解vue-cli本地环境API代理设置和解决跨域
Sep 05 #Javascript
You might like
PHP实现负载均衡的加权轮询方法分析
2018/08/22 PHP
PHP+Redis开发的书签案例实战详解
2019/07/09 PHP
javascript showModalDialog模态对话框使用说明
2009/12/31 Javascript
jQuery 源码分析笔记(2) 变量列表
2011/05/28 Javascript
js带按钮的提示框可供选择示例代码
2013/09/17 Javascript
含有CKEditor的表单如何提交
2014/01/09 Javascript
JavaScript保存并运算页面中数字类型变量的写法
2015/07/06 Javascript
JS onkeypress兼容性写法详解
2016/04/27 Javascript
JavaScript简单实现弹出拖拽窗口(一)
2016/06/17 Javascript
JavaScript从0开始构思表情插件
2016/07/26 Javascript
js删除Array数组中指定元素的两种方法
2016/08/03 Javascript
浅谈javascript中的数据类型转换
2016/12/27 Javascript
AngularJs导出数据到Excel的示例代码
2017/08/11 Javascript
浅谈JS对象添加getter与setter的5种方法
2018/06/09 Javascript
layDate插件设置开始和结束时间
2018/11/15 Javascript
微信小程序基于picker实现级联菜单
2019/02/15 Javascript
Vue 使用计时器实现跑马灯效果的实例代码
2019/07/11 Javascript
js+canvas绘制图形验证码
2020/09/21 Javascript
[03:38]TI4西雅图DOTA2前线报道 71专访
2014/07/08 DOTA
[03:24]CDEC.Y赛前采访 努力备战2016国际邀请赛中国区预选赛
2016/06/25 DOTA
Python简单获取自身外网IP的方法
2016/09/18 Python
将python代码和注释分离的方法
2018/04/21 Python
解决win64 Python下安装PIL出错问题(图解)
2018/09/03 Python
centos6.8安装python3.7无法import _ssl的解决方法
2018/09/17 Python
python用plt画图时,cmp设置方法
2018/12/13 Python
Python学习笔记之字符串和字符串方法实例详解
2019/08/22 Python
pycharm 关掉syntax检查操作
2020/06/09 Python
python中pyqtgraph知识点总结
2021/01/26 Python
警察思想汇报
2014/01/04 职场文书
暑期社会实践学生的自我评价
2014/01/09 职场文书
给学校的建议书
2014/03/12 职场文书
cf收人广告词
2014/03/14 职场文书
入党转正介绍人意见
2015/06/03 职场文书
暑期工社会实践报告
2015/07/13 职场文书
2015年学校政教工作总结
2015/07/20 职场文书
vue ant design 封装弹窗表单的使用
2022/06/01 Vue.js