如何用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 读取xml,写入xml 实现代码
Jul 10 Javascript
屏蔽F1~F12的快捷键的js函数
May 06 Javascript
jquery中插件实现自动添加用户的具体代码
Nov 15 Javascript
EasyUI实现二级页面的内容勾选的方法
Mar 01 Javascript
基于dropdown.js实现的两款美观大气的二级导航菜单
Sep 02 Javascript
两行代码轻松搞定JavaScript日期验证
Aug 03 Javascript
js方法数据验证的简单实例
Sep 17 Javascript
jQuery实现checkbox列表的全选、反选功能
Nov 24 Javascript
JavaScript正则表达式exec/g实现多次循环用法示例
Jan 17 Javascript
Vue实现路由跳转和嵌套
Jun 20 Javascript
关于vue.js组件数据流的问题
Jul 26 Javascript
详解javascript脚本何时会被执行
Feb 05 Javascript
详解TS数字分隔符和更严格的类属性检查
May 06 #Javascript
JS中一些高效的魔法运算符总结
May 06 #Javascript
react国际化react-intl的使用
LayUI+Shiro实现动态菜单并记住菜单收展的示例
如何用JavaScript实现一个数组惰性求值库
原生JS中应该禁止出现的写法
May 05 #Javascript
详解Javascript实践中的命令模式
You might like
php给图片加文字水印
2015/07/31 PHP
PHP+MySQL统计该库中每个表的记录数并按递减顺序排列的方法
2016/02/15 PHP
PHP中OpenSSL加密问题整理
2017/12/14 PHP
PHP结合Vue实现滚动底部加载效果
2017/12/17 PHP
PHP _construct()函数讲解
2019/02/03 PHP
PHP删除数组中特定元素的两种方法
2019/02/28 PHP
jQuery 事件队列调整方法
2009/09/18 Javascript
基于jquery实现图片广告轮换效果代码
2011/07/07 Javascript
js 判断图片是否加载完以及实现图片的预下载
2014/08/14 Javascript
JavaScript中的slice()方法使用详解
2015/06/06 Javascript
js css实现垂直方向自适应的三角提示菜单
2016/06/26 Javascript
基于JavaScript实现的快速排序算法分析
2017/04/14 Javascript
Angularjs实现页面模板清除的方法
2018/07/20 Javascript
vue-swiper的使用教程
2018/08/30 Javascript
使用Python的Tornado框架实现一个简单的WebQQ机器人
2015/04/24 Python
玩转python爬虫之爬取糗事百科段子
2016/02/17 Python
python如何在终端里面显示一张图片
2016/08/17 Python
速记Python布尔值
2017/11/09 Python
Python面向对象思想与应用入门教程【类与对象】
2019/04/12 Python
Python 虚拟空间的使用代码详解
2019/06/10 Python
Python3将jpg转为pdf文件的方法示例
2019/12/13 Python
python中format函数如何使用
2020/06/22 Python
Keras中的两种模型:Sequential和Model用法
2020/06/27 Python
python函数超时自动退出的实操方法
2020/12/28 Python
三星美国官网:Samsung美国
2017/02/06 全球购物
天猫国际进口超市直营:官方直采,一站购齐
2017/12/11 全球购物
意大利高端时尚买手店:Stefania Mode
2018/03/01 全球购物
香港连卡佛百货官网:Lane Crawford
2019/09/04 全球购物
幼儿园教研活动方案
2014/01/19 职场文书
优秀应届生求职信
2014/06/16 职场文书
幽默自我介绍演讲稿
2014/08/21 职场文书
党员“一帮一”活动总结
2015/05/07 职场文书
2015小学教师年度工作总结
2015/05/12 职场文书
2015年财务人员个人工作总结
2015/07/27 职场文书
搞笑婚礼主持词开场白
2015/11/24 职场文书
Nginx tp3.2.3 404问题解决方案
2021/03/31 Servers