如何用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 相关文章推荐
jquery load()在firefox(火狐)下显示不正常的解决方法
Apr 05 Javascript
Js注册协议倒计时的小例子
Jun 24 Javascript
PHP PDO操作总结
Nov 17 Javascript
深入理解MVC中的时间js格式化
May 19 Javascript
Bootstrap 源代码分析(未完待续)
Aug 17 Javascript
js浏览器html5表单验证
Oct 17 Javascript
js获取指定字符前/后的字符串简单实例
Oct 27 Javascript
JS多文件上传的实例代码
Jan 11 Javascript
Thinkphp5微信小程序获取用户信息接口的实例详解
Sep 26 Javascript
vue中本地静态图片路径写法
Mar 06 Javascript
Javascript中prototype与__proto__的关系详解
Mar 11 Javascript
jstree中的checkbox默认选中和隐藏示例代码
Dec 29 Javascript
详解TS数字分隔符和更严格的类属性检查
May 06 #Javascript
JS中一些高效的魔法运算符总结
May 06 #Javascript
react国际化react-intl的使用
LayUI+Shiro实现动态菜单并记住菜单收展的示例
如何用JavaScript实现一个数组惰性求值库
原生JS中应该禁止出现的写法
May 05 #Javascript
详解Javascript实践中的命令模式
You might like
php 数组二分法查找函数代码
2010/02/16 PHP
php 数组排序 array_multisort与uasort的区别
2011/03/24 PHP
摘自织梦CMS中的图片处理类
2015/08/08 PHP
php常用数组array函数实例总结【赋值,拆分,合并,计算,添加,删除,查询,判断,排序】
2016/12/07 PHP
PHP中单例模式与工厂模式详解
2017/02/17 PHP
laravel unique验证、确认密码confirmed验证以及密码修改验证的方法
2019/10/16 PHP
PHP 进程池与轮询调度算法实现多任务的示例代码
2019/11/26 PHP
用roll.js实现的图片自动滚动+鼠标触动的特效
2007/03/18 Javascript
$.ajax json数据传递方法
2008/11/19 Javascript
页面使用密码保护代码
2013/04/10 Javascript
jQuery实现随意改变div任意属性的名称和值(部分原生js实现)
2013/05/28 Javascript
jQuery中:contains选择器用法实例
2014/12/30 Javascript
RequireJs的使用详解
2017/02/19 Javascript
nodejs实现截取上传视频中一帧作为预览图片
2017/12/10 NodeJs
实例解析ES6 Proxy使用场景介绍
2018/01/08 Javascript
简单的Vue SSR的示例代码
2018/01/12 Javascript
node实现登录图片验证码的示例代码
2018/04/20 Javascript
解决修复npm安装全局模块权限的问题
2018/05/17 Javascript
详细解读Python中的__init__()方法
2015/05/02 Python
python基本语法练习实例
2017/09/19 Python
python生成随机图形验证码详解
2017/11/08 Python
TensorFlow实现模型评估
2018/09/07 Python
Python序列对象与String类型内置方法详解
2019/10/22 Python
pytorch 求网络模型参数实例
2019/12/30 Python
Python调用钉钉自定义机器人的实现
2020/01/03 Python
logging level级别介绍
2020/02/21 Python
亚洲领先的旅游体验市场:Voyagin
2019/11/23 全球购物
运动会入场词100字
2014/02/06 职场文书
销售竞赛活动方案
2014/08/23 职场文书
领导欢迎词致辞
2015/01/23 职场文书
骨干教师个人总结
2015/02/11 职场文书
大班上学期个人总结
2015/02/13 职场文书
雨中的树观后感
2015/06/03 职场文书
校运会加油稿大全
2015/07/22 职场文书
为什么MySQL 删除表数据 磁盘空间还一直被占用
2021/10/16 MySQL
Python实现双向链表
2022/05/25 Python