如何用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 动画弹出窗体支持多种展现方式
Apr 29 Javascript
JavaScript 放大镜 放大倍率和视窗尺寸
May 09 Javascript
JS中不为人知的五种声明Number的方式简要概述
Feb 22 Javascript
js获取dom的高度和宽度(可见区域及部分等等)
Jun 13 Javascript
在JavaScript中重写jQuery对象的方法实例教程
Aug 25 Javascript
js在IE与firefox的差异集锦
Nov 11 Javascript
AngularJS ng-change 指令的详解及简单实例
Jul 30 Javascript
Node.js中防止错误导致的进程阻塞的方法
Aug 11 Javascript
jquery+css3问卷答题卡翻页动画效果示例
Oct 26 Javascript
js将字符串中的每一个单词的首字母变为大写其余均为小写
Jan 05 Javascript
推荐10款扩展Web表单的JS插件
Dec 25 Javascript
JS实现的贪吃蛇游戏案例详解
May 01 Javascript
详解TS数字分隔符和更严格的类属性检查
May 06 #Javascript
JS中一些高效的魔法运算符总结
May 06 #Javascript
react国际化react-intl的使用
LayUI+Shiro实现动态菜单并记住菜单收展的示例
如何用JavaScript实现一个数组惰性求值库
原生JS中应该禁止出现的写法
May 05 #Javascript
详解Javascript实践中的命令模式
You might like
ThinkPHP惯例配置文件详解
2014/07/14 PHP
本地计算机无法启动Apache故障处理
2014/08/08 PHP
php获取客户端电脑屏幕参数的方法
2015/01/09 PHP
PHP实现Javascript中的escape及unescape函数代码分享
2015/02/10 PHP
php json转换相关知识(小结)
2018/12/21 PHP
浅析PHP反序列化中过滤函数使用不当导致的对象注入问题
2020/02/15 PHP
PHP反射基础知识回顾
2020/09/10 PHP
JavaScript面向对象(极简主义法minimalist approach)
2012/07/17 Javascript
鼠标悬浮显示二级菜单效果的jquery实现
2014/10/29 Javascript
javascript编写实用的省市选择器
2015/02/12 Javascript
jquery实现表格本地排序的方法
2015/03/11 Javascript
Node.js读写文件之批量替换图片的实现方法
2016/09/07 Javascript
js当前页面登录注册框,固定div,底层阴影的实例代码
2016/10/04 Javascript
html5 canvas 详细使用教程
2017/01/20 Javascript
JS实现图片预加载之无序预加载功能代码
2017/05/12 Javascript
微信小程序wx.request实现后台数据交互功能分析
2017/11/25 Javascript
vue-cli与webpack处理静态资源的方法及webpack打包的坑
2018/05/15 Javascript
详解javascript中的变量提升和函数提升
2018/05/24 Javascript
Javascript中绑定click事件的四种方式介绍
2018/10/26 Javascript
如何去除富文本中的html标签及vue、react、微信小程序中的过滤器
2018/11/21 Javascript
微信小程序工具函数封装
2019/10/28 Javascript
使用Python获取CPU、内存和硬盘等windowns系统信息的2个例子
2014/04/15 Python
python基于itchat实现微信群消息同步机器人
2017/02/27 Python
python实现AES加密解密
2019/03/28 Python
详解Python静态网页爬取获取高清壁纸
2019/04/23 Python
梅尔频率倒谱系数(mfcc)及Python实现
2019/06/18 Python
Tensorflow实现多GPU并行方式
2020/02/03 Python
利用scikitlearn画ROC曲线实例
2020/07/02 Python
python中re模块知识点总结
2021/01/17 Python
二年级学生评语大全
2014/04/23 职场文书
幼儿园六一亲子活动方案
2014/08/26 职场文书
2014年精神文明建设工作总结
2014/11/19 职场文书
2014年手术室工作总结
2014/11/26 职场文书
悬崖上的金鱼姬观后感
2015/06/15 职场文书
篮球比赛通讯稿
2015/07/18 职场文书
Python使用pandas导入csv文件内容的示例代码
2022/12/24 Python