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 相关文章推荐
10个基于jQuery或JavaScript的WYSIWYG 编辑器整理
May 06 Javascript
善用事件代理,警惕闭包的性能陷阱。
Jan 20 Javascript
利用JS延迟加载百度分享代码,提高网页速度
Jul 01 Javascript
教你在heroku云平台上部署Node.js应用
Jul 30 Javascript
浅谈JSON和JSONP区别及jQuery的ajax jsonp的使用
Nov 23 Javascript
Javascript获取统一管理的提示语(message)
Feb 03 Javascript
使用ef6创建oracle数据库的实体模型遇到的问题及解决方案
Nov 09 Javascript
vue实现中部导航栏布局功能
Jul 30 Javascript
小程序实现横向滑动日历效果
Oct 21 Javascript
Node.js 在本地生成日志文件的方法
Feb 07 Javascript
Bootstrap table 服务器端分页功能实现方法示例
Jun 01 Javascript
浅谈node.js中间件有哪些类型
Apr 29 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
phpmyadmin安装时提示:Warning: require_once(./libraries/common.inc.php)错误解决办法
2011/08/18 PHP
php中操作memcached缓存进行增删改查数据的实现代码
2014/08/15 PHP
php保存二进制原始数据为图片的程序代码
2014/10/14 PHP
php使用文本统计访问量的方法
2016/05/12 PHP
网站被恶意镜像怎么办 php一段代码轻松搞定(全面版)
2018/10/23 PHP
基于jQuery的Tab选项框效果代码(插件)
2011/03/01 Javascript
js实现将选中值累加到文本框的方法
2015/08/12 Javascript
获取JS中网页各种高宽与位置的方法总结
2016/07/27 Javascript
jQuery 全选 全部选 反选 实现代码
2016/08/17 Javascript
JS敏感词过滤代码
2016/12/23 Javascript
js实现手机拍照上传功能
2017/01/17 Javascript
JS中使用textPath实现线条上的文字
2017/12/25 Javascript
小程序绑定用户方案优化小结
2019/05/15 Javascript
layui监听单元格编辑前后交互的例子
2019/09/16 Javascript
jQuery实时统计输入框字数及限制
2020/06/24 jQuery
解决vue请求接口第一次成功,第二次失败问题
2020/09/08 Javascript
[03:04]DOTA2英雄基础教程 影魔
2013/12/11 DOTA
[01:21]DOTA2 新英雄 森海飞霞
2020/12/18 DOTA
使用python在校内发人人网状态(人人网看状态)
2014/02/19 Python
在Python操作时间和日期之asctime()方法的使用
2015/05/22 Python
python 按照固定长度分割字符串的方法小结
2018/04/30 Python
对python 中class与变量的使用方法详解
2019/06/26 Python
python将类似json的数据存储到MySQL中的实例
2019/07/12 Python
python使用writerows写csv文件产生多余空行的处理方法
2019/08/01 Python
python3实现用turtle模块画一棵随机樱花树
2019/11/21 Python
Python脚本实现Zabbix多行日志监控过程解析
2020/08/26 Python
购买限量版收藏品、珠宝和礼品:Bradford Exchange
2016/09/23 全球购物
简单说说tomcat的配置
2013/05/28 面试题
铁路安全事故反思
2014/04/26 职场文书
公司周年庆活动方案
2014/08/25 职场文书
报案材料怎么写
2015/05/25 职场文书
海上钢琴师的观后感
2015/06/11 职场文书
行政复议答复书
2015/07/01 职场文书
小学信息技术教学反思
2016/02/16 职场文书
演讲开头怎么书写?
2019/08/06 职场文书
Python办公自动化之教你如何用Python将任意文件转为PDF格式
2021/06/28 Python