如何用JS实现简单的数据监听

 更新时间:2021年05月06日 15:26:13   作者:浅笑·  
这篇文章主要介绍了如何用JS实现简单的数据监听,对数据监听感兴趣的同学,可以参考一下

概述

主要是用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数据监听的资料请关注脚本之家其它相关文章!

相关文章

  • 前端显示json格式化示例代码

    前端显示json格式化示例代码

    项目开发过程中遇到JSON字符串回显的情况,直接显示的话效果很丑,不方便查看,因此需要在前端页面对JSON进行格式化显示,下面这篇文章主要给大家介绍了关于前端显示json格式化的相关资料,需要的朋友可以参考下
    2024-03-03
  • 手写Spirit防抖函数underscore和节流函数lodash

    手写Spirit防抖函数underscore和节流函数lodash

    这篇文章主要介绍了手写Spirit防抖函数underscore和节流函数lodash,接下来将会带你们了解下这两者的区别,以及我们该如何手写实现这两个函数
    2022-03-03
  • js实现从右往左匀速显示图片(无缝轮播)

    js实现从右往左匀速显示图片(无缝轮播)

    这篇文章主要为大家详细介绍了js实现从右往左匀速显示图片,无缝轮播,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-06-06
  • Bootstrap实现导航栏的2种方式

    Bootstrap实现导航栏的2种方式

    这篇文章主要为大家详细介绍了Bootstrap实现导航栏的2种方式,一是利用按钮组实现、二是Bootstrap专门做了相应的css类,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-11-11
  • Bootstrap 最常用的JS插件系列总结(图片轮播、标签切换等)

    Bootstrap 最常用的JS插件系列总结(图片轮播、标签切换等)

    这篇文章主要为大家详细介绍了Bootstrap 最常用的JS插件,包括图片轮播carousel.js、标签切换tab.js、滚动监听scrollspy.js等,感兴趣的小伙伴们可以参考一下
    2016-07-07
  • JavaScript 中级笔记 第二章

    JavaScript 中级笔记 第二章

    对象是组成JavaScript的基本单元。本章将从JavaScript语言中最重要的几个部分开始介绍:引用,函数重载,作用域,闭包和上下文。有了这些知识后,面向对象开发就将变得简单。
    2009-09-09
  • javascript实现确定和取消提示框效果

    javascript实现确定和取消提示框效果

    这篇文章主要介绍了javascript实现确定和取消提示框效果的方法以及示例代码分享,有需要的小伙伴可以参考下。
    2015-07-07
  • 一个轻量级的XHTML右键菜单[支持IE和firefox]

    一个轻量级的XHTML右键菜单[支持IE和firefox]

    一个轻量级的XHTML右键菜单[支持IE和firefox]...
    2007-01-01
  • JavaScript中实现数组分组功能的方法详解

    JavaScript中实现数组分组功能的方法详解

    最近,JavaScript引入了一个备受期待的功能:原生支持数组分组,这一特性使得在处理复杂的数据集时变得更加简单和高效,本文将深入探讨这一全新的JavaScript特性,希望对大家有所帮助
    2023-12-12
  • js删除数组元素、清空数组的简单方法(必看)

    js删除数组元素、清空数组的简单方法(必看)

    下面小编就为大家带来一篇js删除数组元素、清空数组的简单方法(必看)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-07-07

最新评论