如何用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 相关文章推荐
用js脚本控制asp.net下treeview的NodeCheck的实现代码
Mar 02 Javascript
Javascript Math ceil()、floor()、round()三个函数的区别
Mar 09 Javascript
JQuery 学习笔记01 JQuery初接触
May 06 Javascript
JavaScript中的变量声明早于赋值分析
Mar 01 Javascript
简单的js表单验证函数
Oct 28 Javascript
jquery trigger伪造a标签的click事件取代window.open方法
Jun 23 Javascript
详解JavaScript中数组的reduce方法
Dec 02 Javascript
微信小程序之购物车功能
Sep 23 Javascript
快速掌握jquery分页插件jqPaginator的使用方法
Aug 09 jQuery
vue axios 简单封装以及思考
Oct 09 Javascript
axios使用拦截器统一处理所有的http请求的方法
Nov 02 Javascript
java遇到微信小程序 "支付验证签名失败" 问题解决
Dec 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 模拟$_PUT实现代码
2010/03/15 PHP
百度站点地图(百度sitemap)生成方法分享
2014/01/09 PHP
PHP实现获取中英文首字母
2015/06/19 PHP
php实现水印文字和缩略图的方法示例
2016/12/29 PHP
JavaScript 学习笔记(六)
2009/12/31 Javascript
js计算两个时间之间天数差的实例代码
2013/11/19 Javascript
js获取鼠标点击的位置实现思路及代码
2014/05/09 Javascript
MVVM模式中ViewModel和View、Model有什么区别?
2015/06/19 Javascript
一张Web前端的思维导图分享
2015/07/03 Javascript
jQuery+css实现的tab切换标签(兼容各浏览器)
2016/01/28 Javascript
jQuery Ajax 实例代码 ($.ajax、$.post、$.get)
2016/04/29 Javascript
Javascript实现图片加载从模糊到清晰显示的方法
2016/06/21 Javascript
基于cssSlidy.js插件实现响应式手机图片轮播效果
2016/08/30 Javascript
jquery validation验证表单插件
2017/01/07 Javascript
JS日程管理插件FullCalendar简单实例
2017/02/07 Javascript
使用Bootstrap + Vue.js实现添加删除数据示例
2017/02/27 Javascript
js禁止Backspace键使浏览器后退的实现方法
2017/09/01 Javascript
Vue验证码60秒倒计时功能简单实例代码
2018/06/22 Javascript
VUE基于NUXT的SSR 服务端渲染
2018/11/30 Javascript
产制造追溯系统之通过微信小程序实现移动端报表平台
2019/06/03 Javascript
layui实现tab的添加拒绝重复的方法
2019/09/04 Javascript
Element PageHeader页头的使用方法
2020/07/26 Javascript
[01:01:29]2018DOTA2亚洲邀请赛 4.4 淘汰赛 VP vs Liquid 第一场
2018/04/05 DOTA
跟老齐学Python之编写类之一创建实例
2014/10/11 Python
Python操作MongoDB数据库PyMongo库使用方法
2015/04/27 Python
浅析Python中的赋值和深浅拷贝
2017/08/15 Python
Python通过paramiko远程下载Linux服务器上的文件实例
2018/12/27 Python
画pytorch模型图,以及参数计算的方法
2019/08/17 Python
Python3安装pip工具的详细步骤
2019/10/14 Python
python 实现方阵的对角线遍历示例
2019/11/29 Python
python 回溯法模板详解
2020/02/26 Python
班级德育工作实施方案
2014/02/21 职场文书
雷锋精神演讲稿
2014/05/13 职场文书
消防安全承诺书
2014/05/22 职场文书
考试作弊检讨书范文
2015/01/27 职场文书
「女孩的钓鱼慢活」全新版权绘公布
2022/03/21 日漫