如何用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转换字符串为dom对象(字符串动态创建dom)
May 10 Javascript
Javascript Function对象扩展之延时执行函数
Jul 06 Javascript
关于flash遮盖div浮动层的解决方法
Jul 17 Javascript
jQuery事件之键盘事件(ctrl+Enter回车键提交表单等)
May 11 Javascript
window.location 对象所包含的属性
Oct 10 Javascript
jQuery中的编程范式详解
Dec 15 Javascript
Angular限制input框输入金额(是小数的话只保留两位小数点)
Jul 13 Javascript
bootstrap 通过加减按钮实现输入框组功能
Nov 15 Javascript
Vue利用canvas实现移动端手写板的方法
May 03 Javascript
微信公众号H5支付接口调用方法
Jan 10 Javascript
JS数组求和的常用方法总结【5种方法】
Jan 14 Javascript
详解微信小程序文件下载--视频和图片
Apr 24 Javascript
详解TS数字分隔符和更严格的类属性检查
May 06 #Javascript
JS中一些高效的魔法运算符总结
May 06 #Javascript
react国际化react-intl的使用
LayUI+Shiro实现动态菜单并记住菜单收展的示例
如何用JavaScript实现一个数组惰性求值库
原生JS中应该禁止出现的写法
May 05 #Javascript
详解Javascript实践中的命令模式
You might like
PHP5/ZendEngine2的改进
2006/10/09 PHP
php判断变量类型常用方法
2012/04/24 PHP
深入php 正则表达式的学习探讨
2013/06/06 PHP
php遍历目录方法小结
2015/03/10 PHP
php实现在站点里面添加邮件发送的功能
2020/04/28 PHP
php自定义函数实现汉字转换utf8编码的方法
2016/09/29 PHP
基于thinkPHP类的插入数据库操作功能示例
2017/01/06 PHP
Laravel框架中Blade模板的用法示例
2017/08/30 PHP
PHP接入微信H5支付的方法示例
2019/10/28 PHP
JavaScript支持的最大递归调用次数分析
2014/06/24 Javascript
详解JavaScript中setSeconds()方法的使用
2015/06/11 Javascript
Js动态设置rem来实现移动端字体的自适应代码
2016/10/14 Javascript
详解JS-- 浮点数运算处理
2016/11/28 Javascript
详解nodejs 文本操作模块-fs模块(四)
2016/12/22 NodeJs
NodeJs下的测试框架Mocha的简单介绍
2017/02/22 NodeJs
js轮播图透明度切换(带上下页和底部圆点切换)
2017/04/27 Javascript
angularjs封装$http为factory的方法
2017/05/18 Javascript
微信小程序倒计时功能实例代码
2018/07/17 Javascript
VUE兄弟组件传值操作实例分析
2019/10/26 Javascript
vue3为什么要用proxy替代defineProperty
2020/10/19 Javascript
python网络编程之读取网站根目录实例
2014/09/30 Python
Python可跨平台实现获取按键的方法
2015/03/05 Python
Python采集代理ip并判断是否可用和定时更新的方法
2018/05/07 Python
Tensorflow卷积神经网络实例进阶
2018/05/24 Python
浅谈python的输入输出,注释,基本数据类型
2019/04/02 Python
解决pycharm修改代码后第一次运行不生效的问题
2021/02/06 Python
雷曼兄弟的五金店:Lehman’s Hardware Store
2019/04/10 全球购物
linux系统都有哪些运行级别
2016/03/26 面试题
文明教师事迹材料
2014/01/16 职场文书
服务理念口号
2014/06/11 职场文书
2014年单位工作总结范文
2014/11/27 职场文书
2014收银员工作总结范文
2014/12/16 职场文书
导游词之天津古文化街
2019/11/09 职场文书
实例讲解Python中sys.argv[]的用法
2021/06/03 Python
Java实现斗地主之洗牌发牌
2021/06/14 Java/Android
各国货币符号大全
2022/02/17 杂记