如何用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 相关文章推荐
比较全面的event对像在IE与FF中的区别 推荐
Sep 21 Javascript
jQuery实现等比例缩放大图片让大图片自适应页面布局
Oct 16 Javascript
JavaScript面向对象编程入门教程
Apr 16 Javascript
自写的jQuery异步加载数据添加事件
May 15 Javascript
JavaScript 学习笔记之变量及其作用域
Jan 14 Javascript
js手动播放图片实现图片轮播效果
Sep 17 Javascript
JSON对象 详解及实例代码
Oct 18 Javascript
require.js+vue开发微信上传图片组件
Oct 27 Javascript
vue + element-ui实现简洁的导入导出功能
Dec 22 Javascript
原生javascript AJAX 三级联动的实现代码
May 04 Javascript
Vue.js 中取得后台原生HTML字符串 原样显示问题的解决方法
Jun 10 Javascript
微信小程序自定义组件封装及父子间组件传值的方法
Aug 28 Javascript
详解TS数字分隔符和更严格的类属性检查
May 06 #Javascript
JS中一些高效的魔法运算符总结
May 06 #Javascript
react国际化react-intl的使用
LayUI+Shiro实现动态菜单并记住菜单收展的示例
如何用JavaScript实现一个数组惰性求值库
原生JS中应该禁止出现的写法
May 05 #Javascript
详解Javascript实践中的命令模式
You might like
国王的咖啡这么大来头,名字的由来是什么
2021/03/03 咖啡文化
CodeIgniter输出中文乱码的两种解决办法
2014/06/12 PHP
PHP使用Mysqli类库实现完美分页效果的方法
2016/04/07 PHP
实例讲解php将字符串输出到HTML
2019/01/27 PHP
javascript开发技术大全 第4章 直接量与字符集
2011/07/03 Javascript
node.js中的querystring.unescape方法使用说明
2014/12/10 Javascript
Javascript中的几种继承方式对比分析
2016/03/22 Javascript
String字符串截取的四种方式总结
2016/11/28 Javascript
js实现随机抽选效果、随机抽选红色球效果
2017/01/13 Javascript
微信小程序 利用css实现遮罩效果实例详解
2017/01/21 Javascript
nodejs中全局变量的实例解析
2017/03/07 NodeJs
JS解决移动web开发手机输入框弹出的问题
2017/03/31 Javascript
jQuery+SpringMVC中的复选框选择与传值实例
2018/01/08 jQuery
vue实现给div绑定keyup的enter事件
2020/07/31 Javascript
解决vue打包报错Unexpected token: punc的问题
2020/10/24 Javascript
python实现从一组颜色中找出与给定颜色最接近颜色的方法
2015/03/19 Python
Python通过Django实现用户注册和邮箱验证功能代码
2017/12/11 Python
Django中使用第三方登录的示例代码
2018/08/20 Python
django使用xadmin的全局配置详解
2019/11/15 Python
python基于plotly实现画饼状图代码实例
2019/12/16 Python
python扫描线填充算法详解
2020/02/19 Python
国外最大的眼镜网站:Coastal
2017/08/09 全球购物
定义一结构体变量,用其表示点坐标,并输入两点坐标,求两点之间的距离
2015/08/17 面试题
韩语专业本科生求职信
2013/10/01 职场文书
军校制空专业毕业生自我鉴定
2013/11/16 职场文书
毕业生求职信的经典写法
2014/01/31 职场文书
求职自荐信的格式
2014/04/07 职场文书
员工工作表现评语
2014/04/26 职场文书
产品推广策划方案
2014/05/10 职场文书
社会发展项目建议书
2014/08/25 职场文书
员工年终考核评语
2014/12/31 职场文书
个人年终总结怎么写
2015/03/09 职场文书
研究生毕业登记表的自我鉴定范文
2019/07/15 职场文书
Python OpenCV实现传统图片格式与base64转换
2021/06/13 Python
MongoDB支持的索引类型
2022/04/11 MongoDB
Vue OpenLayer 为地图绘制风场效果
2022/04/24 Vue.js