首页 > 其他分享 >监听数组Array变化或Obj属性变化

监听数组Array变化或Obj属性变化

时间:2023-09-13 16:58:17浏览次数:31  
标签:Obj key log 数组 console Array 监听 target

工作中经常会遇到监听数组发生变化时执行相应的回调触发逻辑,客户应用场景中需要实现对象变量的动态监听,当变量发生变化时触发回调函数,实现事件发送等应用场景。      
通常由以下两种方式实现需求

一.通过改变对象原型prototype方法实现回调监听

//创建一个数组原型对象
var arrayProtoType = Object.create(Array.prototype);
var ArrayProto = [];
//重构原型里的方法,同时将重构后的方法赋值给自定义好的数组
Object.getOwnPropertyNames(Array.prototype).forEach(function (key) {
  // console.log(key)
  if (typeof arrayProtoType[key] === "function") {
    ArrayProto[key] = function () {
      listenProtoMethods(key);
      return arrayProtoType[key].apply(this, arguments);
    };
  } else {
    listenProps(key);
    ArrayProto[key] = arrayProtoType[key];
  }
});
function listenProtoMethods(method) {
  console.log("".concat(method, "\u89E6\u53D1\u4E86"));
  //当监听到数组函数变化时执行回调逻辑callback
    dataChanged();
}

function listenProps(prop) {
  console.log("".concat(prop, "\u89E6\u53D1\u4E86"));
  //当监听到数组属性变化时执行回调逻辑callback
	 dataChanged();
}
//监听到属性发生变化时执行以下方法
function dataChanged(){
	console.log('arry data has changed...')
}
var arryWatched = [];
//将被监听的数组原型链指向新构造的原型对象
arryWatched.__proto__ = ArrayProto;
//执行以下函数时将触发回调函数
arryWatched.push();
arryWatched.join();

二.利用Proxy对象将监听对象与配置的监听函数进行关联绑定,实现监听属性变化

        此种方法存在兼容性问题,低版本浏览器不支持Proxy函数

const array = []; 
//定义监听配置条件
const changeHandler = {
  get(target, property) {
    return target[property];
  },
  set(target, property, value) {
    target[property] = value;
    console.log('数组发生变化:', target);
    return true;
  },
  deleteProperty(target, property) {
    delete target[property];
    console.log('数组发生变化:', target);
    return true;
  }
};
//new一个代理对象将监听配置挂接到数组对象实现监听数组变化
const proxyArray = new Proxy(array, changeHandler);
proxyArray.push("data1")
proxyArray.push("data2")

 

标签:Obj,key,log,数组,console,Array,监听,target
From: https://www.cnblogs.com/yangzhihui/p/watch_object_property.html

相关文章

  • 解决vue中watch监听对象变化获取不到旧数据的问题
    解决vue中watch监听对象变化获取不到旧数据的问题1.问题代码watch:{pageInfo:{handler(newVal,oldVal){console.log(newVal,oldVal);},}}结果:打印出来newVal和oldVal输出内容一样console.log(newVal===oldVal)//true发现这......
  • String、StringBuffer和StringBuilder的区别,ArrayList和linkedList的区别,HashMap和Has
    一、String、StringBuffer和StringBuilder的区别1.1相关介绍String是只读字符串,并不是基本数据类型,而是一个对象。从底层源码来看是一个final修饰的字符数组,所引用的字符串不能改变,一经定义无法再增删改。每次对String操作都会生成新的String对象。所以对于经常改变内容的字符串最......
  • Fetch API res.buffer vs res.arrayBuffer All In One
    FetchAPIres.buffervsres.arrayBufferAllInOneerrorTypeError[ERR_INVALID_ARG_TYPE]:The"data"argumentmustbeoftypestringoraninstanceofBuffer,TypedArray,orDataView.ReceivedaninstanceofArrayBufferimportfsfrom'n......
  • 利用Api接口实现手机网络连接断开的监听
    在今天的移动互联网时代,手机已经成为了人们不可或缺的重要工具,而手机的联网状态也是我们经常需要关注的一个问题。我们需要保证手机网络处于正常的连接状态,但是有时候,由于种种原因,手机的网络可能会断开,这时我们需要及时发现,并进行相应的处理措施。而利用Api接口实现手机网络连接断......
  • Ceph Object Gateway
    本次演示环境配置如下:hostnameIProlesnode01.srv.world192.168.10.101ObjectStorage;MonitorDaemon;ManagerDaemonnode02.srv.world192.168.10.102ObjectStoragenode03.srv.world192.168.10.103ObjectStoragedlp.srv.world192.168.10.142clientwww.srv.world192.168.10.140RAD......
  • ArrayList/MySQL数据批量写入Excel表格
    ArrayList/MySQL数据集合写入Excel1.文章概述:写入Excel文件通常需要使用一些库或工具,而"EasyExcel"通常是指的阿里巴巴开源的EasyExcel库。这个库可以让我们在Java中简便地进行Excel文件的读写操作。2.导入配置:<dependency><groupId>com.alibaba</group......
  • AttributeError: 'int' object has no attribute 'items' 混合数据存储
    data={'2023:09:01':{'867726032728067':68},'2023:09:02':{'867726032728067':68},'2023:09:03':0,'2023:09:04':{'866384064965578':48,'867266067918648':46......
  • Animation动画——ObjectAnimator基本使用
    ObjectAnimator是ValueAnimator的子类,他本身就已经包含了时间引擎和值计算,所以它拥有为对象的某个属性设置动画的功能。这使得为任何对象设置动画更加的容易。你不再需要实现ValueAnimator.AnimatorUpdateListener接口,因为ObjectAnimator动画自己会自动更新相应的属性值。ObjectAn......
  • CF1867A green_gold_dog, array and permutation
    思路很简单的一道题,洛谷大概都不会开放题解通道?(实际上貌似每场比赛的A都没开放?)显然,对于原数组较小的数,我们尽量让大的数,取全排列的较小的数,这样可以保证差是逐渐变小的,也就让\(c\)数组差异变大。所以直接拿个struct存,然后两边排序就好。ACcode#include<bits/stdc++.h>......
  • CF1867E2 Salyg1n and Array (hard version)
    其实如果你在做E1的时候想到正解了,这道题都甚至不需要改E1的代码,直接交就好,这大概也是E2的分还没E1的高的原因。因为一摸一样的思路,所以这里就不作介绍了,可以看看我的题解。在这里呢,主要是稍微证明一下询问次数不会超,如下:可以发现,有余数的情况,只会增加两次询问,而后面的......