如何用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实现点击链接弹出"图片另存为"而不是直接打开
Aug 15 Javascript
js中的push和join方法使用介绍
Oct 08 Javascript
checkbox选中与未选中判断示例
Aug 04 Javascript
JavaScript中获取高度和宽度函数总结
Oct 08 Javascript
jQuery简单操作cookie的插件实例
Jan 13 Javascript
javascript实现随机生成DIV背景色
Jun 20 Javascript
Vue axios全局拦截 get请求、post请求、配置请求的实例代码
Nov 28 Javascript
koa-router路由参数和前端路由的结合详解
May 19 Javascript
深度了解vue.js中hooks的相关知识
Jun 14 Javascript
基于layui轮播图满屏是高度自适应的解决方法
Sep 16 Javascript
微信小程序后端无法保持session的原因及解决办法问题
Mar 20 Javascript
javascript设计模式 ? 观察者模式原理与用法实例分析
Apr 22 Javascript
详解TS数字分隔符和更严格的类属性检查
May 06 #Javascript
JS中一些高效的魔法运算符总结
May 06 #Javascript
react国际化react-intl的使用
LayUI+Shiro实现动态菜单并记住菜单收展的示例
如何用JavaScript实现一个数组惰性求值库
原生JS中应该禁止出现的写法
May 05 #Javascript
详解Javascript实践中的命令模式
You might like
实例讲解PHP验证邮箱是否合格
2019/01/28 PHP
javascript读取RSS数据
2007/01/20 Javascript
filemanage功能中用到的lib.js
2007/04/08 Javascript
jQuery EasyUI API 中文文档 搜索框
2011/09/29 Javascript
JS无限极树形菜单,json格式、数组格式通用示例
2013/07/30 Javascript
js的window.showModalDialog及window.open用法实例分析
2015/01/29 Javascript
浅谈node.js中async异步编程
2015/10/22 Javascript
实例解析JS布尔对象的toString()方法和valueOf()方法
2015/10/25 Javascript
JavaScript DOM 学习总结(五)
2015/11/24 Javascript
原生js和jQuery实现淡入淡出轮播效果
2015/12/25 Javascript
js实现上一页下一页的效果【附代码】
2016/03/10 Javascript
微信JS-SDK坐标位置如何转换为百度地图坐标
2016/07/04 Javascript
jQuery动态修改字体大小的方法【测试可用】
2016/09/09 Javascript
jQuery开源组件BootstrapValidator使用详解
2017/06/29 jQuery
使用SVG基本操作API的实例讲解
2017/09/14 Javascript
animate.css在vue项目中的使用教程
2018/08/05 Javascript
vue 监听屏幕高度的实例
2018/09/05 Javascript
mock.js实现模拟生成假数据功能示例
2019/01/15 Javascript
VUEX采坑之路之获取不到$store的解决方法
2019/11/08 Javascript
Vue 的双向绑定原理与用法揭秘
2020/05/06 Javascript
在vue中使用echarts(折线图的demo,markline用法)
2020/07/20 Javascript
[00:08]DOTA2勇士令状等级奖励“天外飞星”
2019/05/24 DOTA
浅析python 中__name__ = '__main__' 的作用
2014/07/05 Python
windows下Virtualenvwrapper安装教程
2017/12/13 Python
Pycharm 创建 Django admin 用户名和密码的实例
2018/05/30 Python
Python的argparse库使用详解
2018/10/09 Python
Python实现企业微信机器人每天定时发消息实例
2020/02/25 Python
python 6.7 编写printTable()函数表格打印(完整代码)
2020/03/25 Python
纯CSS3大转盘抽奖示例代码(响应式、可配置)
2017/01/13 HTML / CSS
html5 canvas绘制矩形和圆形的实例代码
2016/06/16 HTML / CSS
新西兰便宜隐形眼镜购买网站:QUICKLENS New Zealand
2019/03/02 全球购物
Camper鞋西班牙官方网上商店:西班牙马略卡岛的鞋类品牌
2019/03/14 全球购物
大宝sod蜜广告词
2014/03/21 职场文书
护士医德考评自我评价
2015/03/03 职场文书
婚礼双方父亲致辞
2015/07/27 职场文书
Python import模块的缓存问题解决方案
2021/06/02 Python