vue2.x 源码--重写数组方法实现监听

本文介绍Vue2中如何使数组具有响应式特性,通过对数组方法进行代理来实现在不改变原有方法行为的同时进行数据变更的拦截。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

vue2中,对于数组和对象是没有办法进行响应的

所以通过中间处理进行数据拦截,但是前提条件是不改变原有push,pop这些方法的原有行为
在这里插入图片描述

vue 源码

简单实现代码

var interception = [
	"push",
	"pop",
	"shift",
	"unshift",
	"splite",
	"sort"
];

var arrayProto = Array.prototype;
//代理原型对象
var proxyProtoObj = Object.create(arrayProto);

         interception.forEach(function(method){
	proxyProtoObj[method] = function(){
		//1: 保留原有的行为
		var res = arrayProto[method].apply(this, arguments);
		//2: 拦截
		console.log("拦截你对于"+method+"的操作");
		return res;
	}
})

var arr = [1, 2, 3, 4, 5];
arr.__proto__ = proxyProtoObj;

arr.push(6);
console.log(arr)

vue2.x 源码的书写

var arrayProto = Array.prototype;
var arrayMethods = Object.create(arrayProto);

var methodsToPatch = [
	'push',
	'pop',
	'shift',
	'unshift',
	'splice',
	'sort',
	'reverse'
];

/**
 * Intercept mutating methods and emit events
 */
methodsToPatch.forEach(function(method) {
	// cache original method
	var original = arrayProto[method];
	def(arrayMethods, method, function mutator() {
		var args = [],
			len = arguments.length;
		while (len--) args[len] = arguments[len];

		var result = original.apply(this, args);
		var ob = this.__ob__;
		var inserted;
		switch (method) {
			case 'push':
			case 'unshift':
				inserted = args;
				break
			case 'splice':
				inserted = args.slice(2);
				break
		}
		if (inserted) {
			ob.observeArray(inserted);
		}
		// notify change
		ob.dep.notify();
		return result
	});
});
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值