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 相关文章推荐
Javascript连接多个数组不用concat来解决
Mar 24 Javascript
javascript中 try catch用法
Aug 16 Javascript
jQuery获取访问者IP地址的方法(基于新浪API与QQ查询接口)
May 25 Javascript
jQuery中on绑定事件后引发的事件冒泡问题如何解决
May 25 Javascript
jQuery实现图片滑动效果
Mar 08 Javascript
vue-resouce设置请求头的三种方法
Sep 12 Javascript
Node.js创建HTTP文件服务器的使用示例
May 11 Javascript
Vue.JS实现垂直方向展开、收缩不定高度模块的JS组件
Jun 19 Javascript
详解React native fetch遇到的坑
Aug 30 Javascript
100行代码实现一个vue分页组功能
Nov 06 Javascript
Vue.extend 编程式插入组件的实现
Nov 18 Javascript
Express 配置HTML页面访问的实现
Nov 01 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
人大复印资料处理程序_输入篇
2006/10/09 PHP
与数据库连接
2006/10/09 PHP
php中一个有意思的日期逻辑处理
2012/03/25 PHP
解析PHP获取当前网址及域名的实现代码
2013/06/23 PHP
Windows中使用计划任务自动执行PHP程序实例
2014/05/09 PHP
一个经典的PHP验证码类分享
2014/11/18 PHP
8个PHP数组面试题
2015/06/23 PHP
数据结构之利用PHP实现二分搜索树
2020/10/25 PHP
JQuery中根据属性或属性值获得元素(6种情况获取方法)
2013/01/17 Javascript
php跨域调用json的例子
2013/11/13 Javascript
javascript页面动态显示时间变化示例代码
2013/12/18 Javascript
JS实现随机乱撞彩色圆球特效的方法
2015/05/05 Javascript
ionic在开发ios系统微信时键盘挡住输入框的解决方法(键盘弹出问题)
2016/09/06 Javascript
BootStrap入门教程(一)之可视化布局
2016/09/19 Javascript
JS识别浏览器类型(电脑浏览器和手机浏览器)
2016/11/18 Javascript
JavaScript中利用for循环遍历数组
2017/01/15 Javascript
Vue.js实战之利用vue-router实现跳转页面
2017/04/01 Javascript
AngularJS 仿微信图片手势缩放的实例
2017/09/28 Javascript
详解vue 2.6 中 slot 的新用法
2019/07/09 Javascript
highcharts.js数据绑定方式代码实例
2019/11/13 Javascript
python插入数据到列表的方法
2015/04/30 Python
遍历python字典几种方法总结(推荐)
2016/09/11 Python
python读取二进制mnist实例详解
2017/05/31 Python
Python获取昨天、今天、明天开始、结束时间戳的方法
2018/06/01 Python
python实现黑客字幕雨效果
2018/06/21 Python
django rest framework serializers序列化实例
2020/05/13 Python
Django ORM实现按天获取数据去重求和例子
2020/05/18 Python
Pymysql实现往表中插入数据过程解析
2020/06/02 Python
使用python对excel表格处理的一些小功能
2021/01/25 Python
HTML5中Canvas与SVG的画图原理比较
2013/01/16 HTML / CSS
Joseph官网:英国小众奢侈品牌
2019/05/17 全球购物
什么是数据库锁?Oracle中都有哪些类型的锁?
2015/08/21 面试题
新员工入职感言
2014/02/01 职场文书
被委托人身份证明
2015/08/07 职场文书
22句经典语录:送给优柔寡断和胡思乱想的朋友们
2019/12/13 职场文书
MySQL高速缓存启动方法及参数详解(query_cache_size)
2021/07/01 MySQL