JS 数据变化监听函数封装

news2024/11/19 5:35:54

文章目录

  • 监听函数
  • 使用用例
    • 重复添加函数,只有最后一个监听函数有效

监听函数

/**
 * 监听函数
 * @param {对象} vm 
 * @param {键值} key 
 * @param {触发函数} action 
 */
function WatchValueChange(vm, key, action) {
    var val = vm[key]
    Object.defineProperty(vm, key, {
        enumerable: true,
        configurable: true,
        get() {
            return val
        },
        set(newVal) {
            action()
            if (val !== newVal) {
                val = newVal
            }
        }
    })
}

使用用例

var testObj = {
    index: 0
}

/**
 * 监听函数
 * @param {对象} vm 
 * @param {键值} key 
 * @param {触发函数} action 
 */
function WatchValueChange(vm, key, action) {
    var val = vm[key]
    Object.defineProperty(vm, key, {
        enumerable: true,
        configurable: true,
        get() {
            return val
        },
        set(newVal) {
            action()
            if (val !== newVal) {
                val = newVal
            }
        }
    })
}

WatchValueChange(testObj, 'index', () => {
    console.log('我是监听函数')
})
// definedAttribute(testObj, 'index', 0, testFunction)

// testObj.index = 0
for (var i = 0; i < 10; i++) {
    testObj.index++
    console.log(testObj.index)
}

打印
在这里插入图片描述

重复添加函数,只有最后一个监听函数有效


var testObj = {
    index: 0
}

/**
 * 监听函数
 * @param {对象} vm 
 * @param {键值} key 
 * @param {触发函数} action 
 */
function WatchValueChange(vm, key, action) {
    var val = vm[key]
    Object.defineProperty(vm, key, {
        enumerable: true,
        configurable: true,
        get() {
            return val
        },
        set(newVal) {
            action()
            if (val !== newVal) {
                val = newVal
            }
        }
    })
}

WatchValueChange(testObj, 'index', () => {
    console.log('我是监听函数')
})

WatchValueChange(testObj, 'index', () => {
    console.log('我是另一个监听函数')
})
// definedAttribute(testObj, 'index', 0, testFunction)

// testObj.index = 0
for (var i = 0; i < 10; i++) {
    testObj.index++
    console.log(testObj.index)
}

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/699752.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

阿里内部流传出来的《1000 道互联网大厂 Java 工程师面试题》来袭,面试必刷,跳槽大厂神器

眼看着"金九银十"也快到来了&#xff0c;很多小伙伴都蠢蠢欲动想要刚给自己涨一波薪资&#xff1b;面试作为涨薪最直接最有效的方式&#xff0c;我们需要花费巨大的精力和时间来准备。除了自身的技术积累之外&#xff0c;掌握一定的面试技巧和熟悉最常见的面试题&…

掌握imgproc组件:opencv-图像轮廓与图像分割修复

图像轮廓与图像分割修复 1.查找并绘制轮廓1.1 寻找轮廓&#xff1a;findContours()函数1.2 绘制轮廓&#xff1a;drawContours()函数1.3 案例程序&#xff1a;轮廓查找 2. 寻找物体的凸包2.1 凸包2.2 寻找凸包&#xff1a;convexHull()函数2.3 案例&#xff1a;寻找和绘制物体的…

【前端|CSS系列第1篇】CSS零基础入门之CSS的基本概念和选择器

欢迎来到CSS零基础入门系列的第一篇博客&#xff01;在这个系列中&#xff0c;我们将一起学习CSS&#xff08;层叠样式表&#xff09;的基础知识&#xff0c;探索如何为网页添加样式和布局。本篇博客将重点介绍CSS的基本概念和选择器&#xff0c;帮助你理解CSS的核心概念。 1.…

MAYA活塞(使用骨骼)

复制骨骼 P父子关系 创建组

根据数组中对象的某个字段分组最简洁方式

使用map数据结构的&#xff0c;键值唯一性进行操作 //根据年龄分组&#xff0c;获取目标数据格式//[{key:key,data:[{}]}]//{key:[]}const arr [{ name:test1,age:10},{ name:test2,age:20},{ name:test3,age:10},{ name:test4,age:20},{ name:test5,age:10},{ name:test6,age…

群晖 NAS WebDAV服务手机ES文件浏览器远程访问

文章目录 1. 安装启用WebDAV2. 安装cpolar3. 配置公网访问地址4. 公网测试连接5. 固定连接公网地址6. 使用固定地址测试连接 转载自cpolar极点云文章&#xff1a;群晖NAS搭建WebDAV服务手机ES文件浏览器远程访问 有时候我们想通过移动设备访问群晖NAS 中的文件,以满足特殊需求,…

centos7安装zabbix v4

1.获取rpm包 wget -c https://mirrors.aliyun.com/zabbix/zabbix/4.0/rhel/7/x86_64/zabbix-release-4.0-2.el7.noarch.rpm 2.安装 yum install zabbix-release-4.0-2.el7.noarch.rpm -y 3.关防火墙和selinux 4.下载数据库 yum install mariadb -y 5.启动数据库设置密码 …

UE4 Cesium离线生成地形

地理空间数据云 首先进这个网址&#xff0c;下载对应的tif以及高程&#xff08;DEM&#xff09; 下载CesiumLab2 在地形切片中点击添加&#xff0c;将黑白图像数据&#xff0c;添加&#xff0c;选择存储类型为散列文件&#xff0c;选择输出路径 再选择影像切片&#xff0c;选择…

Redis 数据类型 | Navicat 数据编辑器

Redis 有别于其他键值&#xff08;key-value&#xff09;存储的一个关键特性是它支持多种数据类型&#xff0c;包括字符串&#xff08;string&#xff09;、列表&#xff08;list&#xff09;、集合&#xff08;set&#xff09;、排序集合&#xff08;sorted set&#xff09;和…

Sparse Fuse Dense: 向高质量的深度补全3D目标检测迈进

点云的稀疏性&#xff1a;在远距离和遮挡区域提供的信息较差&#xff0c;导致难以生成精确的3D边界框。 出现了多模态融合。 图像和点云的不同表示方式使得它们难以融合&#xff0c;导致性能不佳。 论文提出了一种新颖的多模态框架SFD&#xff08;Sparse Fuse Dense&#xf…

Docker学习笔记14

容器镜像在Docker host的存储位置&#xff1a; 最上面的层&#xff08;layer&#xff09;为读写层&#xff0c;也就是容器。下面的其他的层都是只读层的镜像层。并且除了最下面的一层外&#xff0c;其他的层都有一个指针指向自己下面的一层镜像&#xff08;联合文件系统&#…

SpringMVC入门篇2 --- 请求与响应

目录 1.请求映射路径 在类上面统一设置RequestMapping注解&#xff0c;统一设置访问路径前缀。 在上文案例的基础上进行修改。 src/main/java/org/example/controller/UserController.java package org.example.controller;import org.springframework.stereotype.Controll…

寻寻觅觅,彩电厂商能否“智”取未来?

彩电业&#xff0c;还能不能好&#xff1f; 电视行业的发展&#xff0c;一直伴随着漫长的价格战。从黑白到彩电再到超大屏&#xff0c;从CRT到平板再到液晶&#xff0c;在每一轮技术革新之后&#xff0c;市场总会经历从落到起&#xff0c;从起到落的循环&#xff0c;然后陷入价…

重磅!2023年影响因子正式发布 , Nature/Science等顶刊普遍下降 (附名单下载)~

2023年6月28日&#xff0c;科睿唯安&#xff08;Clarivate Analytics&#xff09;发布了最新年度期刊引证报告(JCR), 其中包含我们所关注的最新影响因子(Impact Factor, IF). 科研界对每年影响因子发布可谓是翘首以待&#xff0c;据小编统计发现&#xff0c;今年的影响因子普遍…

安科瑞故障电弧探测器在建筑电气的设计与应用

安科瑞 崔丽洁 【摘要】&#xff1a;电气设备是建筑中不可缺少的一部分&#xff0c;具有较为重要的作用和意义&#xff0c;在应用过程中不仅能够提升建筑本身实用性能&#xff0c;而且可为消费者提供更加优良的生活环境。但设备一旦在运行过程中出现故障&#xff0c;不仅会影响…

使用python3的sqlalchemy+sqlcipher3对sqlite3数据加密,使用pysqlcipher3编译打建环境,并写项目测试

一、背景 最近有个想法&#xff0c;想写一个软件&#xff0c;前期本来想用java的springboot加vue来实现&#xff0c;数据库选sqlite来存储&#xff0c;但在用spingboot框架搭好之后&#xff0c;感觉这款软件更适合用python来写&#xff0c;java不适windows桌面系统&#xff0c…

Spring Boot 中的 Environment

Spring Boot 中的 Environment 在 Spring Boot 中&#xff0c;Environment 是一个重要的组件&#xff0c;用于管理应用程序的配置。它是一个接口&#xff0c;提供了访问应用程序配置属性的方法。在本文中&#xff0c;我们将深入探讨 Spring Boot 中的 Environment&#xff0c;…

Git基本操作总结

0.Git操作关系图 1.初次创建仓库 1)git ini&#xff08;初次提交时使用&#xff0c;项目中会生成.git文件&#xff09; 2)git add . 3)git commit -m “提交代码” 4)git remote add origin “http://xxx.git”&#xff08;关联远程主机&#xff09; / git remote rm origin …

服务器数据恢复-NetApp FAS存储误删文件夹的数据恢复案例

NetApp存储故障&分析&#xff1a; 某公司一台NetApp存储&#xff0c;工作人员误操作删除一个重要的文件夹。 虽然被删除已经有一段时间了&#xff0c;但是根据NetApp文件系统WAFL的特点&#xff0c;数据被覆盖的可能性不大。 NetApp存储数据恢复过程&#xff1a; 1、由于不…

自学黑客(网络安全),一般人我劝你还是算了吧(自学网络安全学习路线--第二十章 欺骗攻击及防御技术上)【建议收藏】

文章目录 一、自学网络安全学习的误区和陷阱二、学习网络安全的一些前期准备三、自学网络安全学习路线一、概述二、IP欺骗及防御技术1、基本的IP欺骗2、源路由攻击3、IP欺骗的高级应用——TCP会话劫持4、TCP三步握手连接建立5、TCP会话劫持过程6、IP欺骗攻击的防御7、防范源路由…