如何用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编程起步(第一课)
Jan 10 Javascript
js网页版计算器的简单实现
Jul 02 Javascript
判断一个对象是否为jquery对象的方法
Mar 12 Javascript
DOM基础教程之使用DOM设置文本框
Jan 20 Javascript
jQuery使用$.get()方法从服务器文件载入数据实例
Mar 25 Javascript
原生JS实现不断变化的标签
May 22 Javascript
详解react-native-fs插件的使用以及遇到的坑
Sep 12 Javascript
AngularJS实现controller控制器间共享数据的方法示例
Oct 30 Javascript
基于vue中keep-alive缓存问题的解决方法
Sep 21 Javascript
layer.open回调获取弹出层参数的实现方法
Sep 10 Javascript
Layer.js实现表格溢出内容省略号显示,悬停显示全部的方法
Sep 16 Javascript
Vue和Flask通信的实现
May 19 Vue.js
详解TS数字分隔符和更严格的类属性检查
May 06 #Javascript
JS中一些高效的魔法运算符总结
May 06 #Javascript
react国际化react-intl的使用
LayUI+Shiro实现动态菜单并记住菜单收展的示例
如何用JavaScript实现一个数组惰性求值库
原生JS中应该禁止出现的写法
May 05 #Javascript
详解Javascript实践中的命令模式
You might like
浅析php过滤html字符串,防止SQL注入的方法
2013/07/02 PHP
Laravel中使用自己编写类库的3种方法
2015/02/10 PHP
PHP正则获取页面所有图片地址
2016/03/23 PHP
Laravel实现autoload方法详解
2017/05/07 PHP
PHP聊天室简单实现方法详解
2018/12/08 PHP
js如何获取兄弟、父类等节点
2014/01/06 Javascript
jQuery中clone()方法用法实例
2015/01/16 Javascript
AngularJS 实现按需异步加载实例代码
2015/10/18 Javascript
深入解析jQuery中Deferred的deferred.promise()方法
2016/05/03 Javascript
又一枚精彩的弹幕效果jQuery实现
2016/07/25 Javascript
最全面的百度地图JavaScript离线版开发
2016/09/10 Javascript
js实现的在线调色板功能完整实例
2016/12/21 Javascript
微信小程序 弹幕功能简单实例
2017/02/14 Javascript
解决Mac下安装nmp的淘宝镜像失败问题
2018/05/16 Javascript
实例讲解JS中pop使用方法
2019/01/27 Javascript
利用不到200行代码写一款属于你自己的js类库
2019/07/08 Javascript
ES6 Class中实现私有属性的一些方法总结
2019/07/08 Javascript
layui的表单提交以及验证和修改弹框的实例
2019/09/09 Javascript
vue实现自定义多选按钮
2020/07/16 Javascript
[54:08]LGD女子刀塔学院 DOTA2炼金术士教学
2014/01/09 DOTA
[02:11]完美世界DOTA2联赛10月28日赛事精彩集锦:来吧展示实力强劲
2020/10/29 DOTA
python中bisect模块用法实例
2014/09/25 Python
python脚本实现验证码识别
2018/06/07 Python
Python清空文件并替换内容的实例
2018/10/22 Python
在Python中pandas.DataFrame重置索引名称的实例
2018/11/06 Python
python算法与数据结构之单链表的实现代码
2019/06/27 Python
python生成器/yield协程/gevent写简单的图片下载器功能示例
2019/10/28 Python
python__name__原理及用法详解
2019/11/02 Python
python3 使用Opencv打开USB摄像头,配置1080P分辨率的操作
2019/12/11 Python
python中有关时间日期格式转换问题
2019/12/25 Python
Django bulk_create()、update()与数据库事务的效率对比分析
2020/05/15 Python
python元组拆包实现方法
2021/02/28 Python
css3 给页面加个半圆形导航条主要利用旋转和倾斜样式
2014/02/10 HTML / CSS
学习委员竞选稿
2015/11/20 职场文书
Python访问Redis的详细操作
2021/06/26 Python
ubuntu开机后ROS程序自启动问题
2022/12/24 Servers