如何用JS实现简单的数据监听


Posted in Javascript onMay 06, 2021

概述

主要是用Object.defineProperty实现类似vue的数据绑定。

第一步

const data = {
  name: "tom",
  age: 14
}
Object.defineProperty(data, "name", {
  get(){
    return "name被读取了"
  },
 set(val){
   console.log(‘我被赋值了‘,val)
 }
})
//将此代码放到浏览器控制台查看效果
console.log(data.name )

输出的data.name并不是tom,而是name被读取了,因为defineProperty对data的name字段进行的监听劫持,修改了,name字段本应该返回的值。

第二步

const _data = { ...data }
for(let i in data){
  Object.defineProperty(data, i, {
    get(){
      return _data[i]+"经过了js的修改"
    },
    set(val){
      _data[i] = val;
    }
  })
}

为什么需要单独的_data?

回答:监听了data的字段,并修改了字段的返回属性,导致的影响就是,每次获取data内监听的字段时候,浏览器都会调用get返回的值,如果你get里直接返回return data[i]的话,就会导致浏览器不停的调用get方法,从而进入到一个死循环当中。

给data多添加一点数据

const data = {
  name: "tom",
  age: 14,
  friend: {
        "name1": "张三",
        "name2": "李四",
        "name3": "王五",
        "name4": "赵六"
  },
}

格式化初始值

const createNewWatch = (val, path, parentKey, event) => {
       //如果值不是object类型,那么直接返回此值
       if(typeof val != ‘object‘) return val;
       //反之如果是object类型,那么调用WatchObject,在进行子元素的遍历及监听
       //WatchObject会在下面的代码中进行创建
       return WatchObject(val,path.concat(parentKey), event)
    }
广州品牌设计公司https://www.houdianzi.com

格式化object对象,监听值

const WatchObject = (data, path, event) => {
  function WatchObject(){
    for(var key in data){
        //调用之前创建的函数,格式化val
        data[key] = createNewWatch(data[key], path, key, event)
        //创建对数据key的监听
        defineProperty(this, key, data[key], path.concat(key), event)
    }
  }
  return new WatchObject()
}

最后执行代码,一个简单的数据监听就完成了。

const b = WatchObject(data,[],{ 
    set(path,val){ 
      console.log(path,val) 
    } 
})

以上就是如何用JS实现简单的数据监听的详细内容,更多关于JS数据监听的资料请关注三水点靠木其它相关文章!

Javascript 相关文章推荐
Javascript操作select方法大全[新增、修改、删除、选中、清空、判断存在等]
Sep 26 Javascript
jquery 图片 上一张 下一张 链接效果(续篇)
Apr 20 Javascript
关于ExtJS4.1:快捷键支持的问题
Apr 24 Javascript
基于JavaScript实现继承机制之构造函数+原型链混合方式的使用详解
May 07 Javascript
关于JavaScript中name的意义冲突示例介绍
May 29 Javascript
require.js 加载 vue组件 r.js 合并压缩的实例
Oct 14 Javascript
AngularJS定时器的使用与移除操作方法【interval与timeout】
Dec 14 Javascript
jQuery编写textarea输入字数限制代码
Mar 23 jQuery
React 子组件向父组件传值的方法
Jul 24 Javascript
js技巧之十几行的代码实现vue.watch代码
Jun 09 Javascript
Vue 递归多级菜单的实例代码
May 05 Javascript
Jquery异步上传文件代码实例
Nov 13 jQuery
详解TS数字分隔符和更严格的类属性检查
May 06 #Javascript
JS中一些高效的魔法运算符总结
May 06 #Javascript
react国际化react-intl的使用
LayUI+Shiro实现动态菜单并记住菜单收展的示例
如何用JavaScript实现一个数组惰性求值库
原生JS中应该禁止出现的写法
May 05 #Javascript
详解Javascript实践中的命令模式
You might like
地摊中国 - 珍藏老照片
2020/08/18 杂记
PHP输出时间差函数代码
2013/01/28 PHP
基于curl数据采集之正则处理函数get_matches的使用
2013/04/28 PHP
PHP仿博客园 个人博客(2) 数据库增添改删
2013/07/05 PHP
PHP计算一年多少个星期和每周的开始和结束日期
2014/07/01 PHP
php+curl 发送图片处理代码分享
2015/07/09 PHP
PHP中ID设置自增后不连续的原因分析及解决办法
2016/08/21 PHP
PHP抽象类与接口的区别详解
2019/03/21 PHP
javascript 操作select下拉列表框的一点小经验
2010/03/20 Javascript
Javascript字符串对象的常用方法简明版
2014/06/26 Javascript
jQuery 遍历函数详解
2015/07/05 Javascript
使用JavaScript获取Request中参数的值方法
2016/09/27 Javascript
谈谈JS中常遇到的浏览器兼容问题和解决方法
2016/12/17 Javascript
js时间戳和c#时间戳互转方法(推荐)
2017/02/15 Javascript
jquery获取select,option所有的value和text的实例
2017/03/06 Javascript
微信小程序中的swiper组件详解
2017/04/14 Javascript
jQuery实现的五星点评功能【案例】
2019/02/18 jQuery
微信小程序--获取用户地理位置名称(无须用户授权)的方法
2019/04/29 Javascript
Javascript如何实现扩充基本类型
2020/08/26 Javascript
[04:00]DOTA2解说界神雕侠侣 CJ第四天谷子现场过生日
2013/07/30 DOTA
[54:51]Ti4 冒泡赛第二轮LGD vs C9 3
2014/07/14 DOTA
[04:54]DOTA2-DPC中国联赛1月31日Recap集锦
2021/03/11 DOTA
Python常用正则表达式符号浅析
2014/08/13 Python
Python中getattr函数和hasattr函数作用详解
2016/06/14 Python
Matplotlib 生成不同大小的subplots实例
2018/05/25 Python
python写入并获取剪切板内容的实例
2018/05/31 Python
python 自定义对象的打印方法
2019/01/12 Python
Python使用re模块验证危险字符
2020/05/21 Python
澳洲本土太阳镜品牌:Quay Australia
2019/07/29 全球购物
日语专业毕业生自荐信
2013/11/11 职场文书
人民教师求职自荐信
2014/03/12 职场文书
数学教育专业求职信
2014/07/22 职场文书
2015初中团支部工作总结
2015/07/21 职场文书
Windows10下安装MySQL8
2021/04/06 MySQL
详解Redis主从复制实践
2021/05/19 Redis
Python编程中Python与GIL互斥锁关系作用分析
2021/09/15 Python