问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

如何监听JS数组的变化

发布网友 发布时间:2022-04-20 10:29

我来回答

2个回答

热心网友 时间:2022-04-22 11:30

javascript监听数组变化思路
1、定义变量arrayProto接收Array的prototype
2、定义变量arrayMethods,通过Object.create()方法继承arrayProto
3、重新封装数组中push,pop等常用方法。(这里我们只封装我们需要监听的数组的方法,并不做JavaScript原生Array中原型方法的重写的这么一件暴力的事情)
4、其他js数组变化监听方法
js监听数组变化实现方法
这里我们首先需要确定的一件事情就是,我们只需要监听我们需要监听的数据数组的一个变更,而不是针对原生Array的一个重新封装。
其实代码实现起来会比较简短,这一部分代码我会直接带着注释贴出来
// 获取Array原型const arrayProto = Array.prototype;const arrayMethods = Object.create(arrayProto);const newArrProto = [];
[ 'push', 'pop', 'shift', 'unshift', 'splice', 'sort', 'reverse'].forEach(method => { // 原生Array的原型方法
let original = arrayMethods[method]; // 将push,pop等方法重新封装并定义在对象newArrProto的属性上
// 这里需要注意的是封装好的方法是定义在newArrProto的属性上而不是其原型属性
// newArrProto.__proto__ 没有改变
newArrProto[method] = function mutator() { console.log('监听到数组的变化啦!'); // 调用对应的原生方法并返回结果(新数组长度)
return original.apply(this, arguments);
}
})let list = [1, 2];// 将我们要监听的数组的原型指针指向上面定义的空数组对象// newArrProto的属性上定义了我们封装好的push,pop等方法list.__proto__ = newArrProto;
list.push(3); // 监听到数组的变化啦! 3// 这里的list2没有被重新定义原型指针,所以这里会正常执行原生Array上的原型方法let list2 = [1, 2];
list2.push(3); // 3

目前为止我们已经实现了数组的监听。从上面我们看出,当我们将需要监听的数组的原型指针指向newArrProto对象上的时候(newArrProto的属性上定义了我们封装好的push,pop等方法)。这样做的好处很明显,不会污染到原生Array上的原型方法。

热心网友 时间:2022-04-22 12:48

  流行的MVVM的JS库/框架都有共同的特点就是数据绑定,在数据变更后响应式的自动进行相关计算并变更DOM展现。所以这个问题也可以理解为如何实现MVVM库/框架的数据绑定。
  常见的数据绑定的实现有脏值检测,基于ES5的getter和setter,以及ES已被废弃的Object.observe,和ES6中添加的Proxy。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
女生多大后可以不在长身高? 如何不用软件把手机投屏到电脑上手机屏幕怎样投放到电脑上 战时拒绝、故意延误军事订货罪既遂的处罚? 战时故意延误军事订货罪处罚标准 名师1+1导读方案:汤姆·索亚历险记目录 三星sm-g7200打开微信慢,无法正常收看,网速不慢。 笔记本电脑如何调亮屏幕亮度 大伙说说洗衣机要不要带烘干好 热烘干洗衣机怎么样 ef英语哪个好 JS中的 Array 类是否有 add方法 JS数组扁平化处理的几种方法 数组操作pop push shift unshift有什么区别 js数组哪些方法返回 JavaScript 如何统计一段时间内鼠标点击次数 JS定义一个函数,可以通过下标删除数组数据,返回... js数组中有哪些方法呢? js 类数组有push pop方法吗 最新版《幼儿园工作规程》是在哪年颁布 为什么有些规范2010颁布却写2016版 昨天刚办的建设银行卡怎么转出两笔五块钱 什么是建行 转出转账? 怎么把异地建设银行的卡里的钱转到另个卡上,不需要... 怎么把建行卡里的钱转到支付宝里 建行一户通怎么转出 建行信用卡现金怎么转出 建设银行信用卡钱怎样转出 建行快贷专用账户的钱怎么转出来? 建行整存整取 三个月钞 钱怎么取出来啊 建设银行挂失补到新卡后,原先卡里的钱要怎么转出来 JavaScript 的限制,Vue 不能检测数组和对象的变化... JS里将函数赋值给变量和将函数名赋值给变量有什么... JavaScript 关于数组 shift()的问题 js如何把下面数组中的后2个移到数组前面去 JS几种数组遍历方式和性能分析对比 请问一个javascript的问题 Js中数组有哪些方法 JS有没有什么方法可以遍历数组全部项后 做出判断 js数组添加元素 以下选项中哪些属于原生 js 操作数组的方法 splice... 手机怎么清理卸载残留 手机卸载软件残留怎么清理 手机软件卸载残留的文件夹和文件怎么清理 怎么样才能清理手机内 手机软件删除后残余怎么清理 安卓手机怎样清除手机内存里的残留垃圾文件? 头上都是头皮屑,很大很多,如何去除 头上有大块头皮屑怎么办 头皮屑太多,洗也洗不好,而且都是大片大片的怎么办。 如何去除头皮屑而且是一大块一大块的