【手写】MVVM原理4

5 篇文章 0 订阅

刚写的原理,先放上来再说,后续补充解说

obeserver.js

/*
	主要是把这个对象变成get和set

*/
class Observer{
	constructor(data){
		//专门用于劫持用的
		this.observer(data)
	}
	observer(data){
		//要对这个data数据,将原有的属性改成set和get的形式
		//首先,data要存在,并且要是对象 才能劫持,否则就不劫持,直接return掉
		if(!data || typeof data !== 'object'){
			return;
		}
		//要将数据一一劫持,先获取到data的key和value
		Object.keys(data).forEach(key => {
			//劫持
			//定义响应式
			this.defineReactive(data,key,data[key]);
			this.observer(data[key]);//深度劫持,对象里的属性如果为对象,也需要劫持一下
		})

	}
	//定义响应式,也就是给某个对象,定义某个属性
	defineReactive(obj,key,value){
		let that = this;
		let dep = new Dep();//每个变化的数据,都会对应一个数组,这个数组是存放所有更新的操作
		Object.defineProperty(obj, key, {
			enumerable:true,//可枚举,就是for循环能循环出来
			configurable:true,//可操作性
			get(){//取值的时候,调这个方法
				Dep.target && dep.addSub(Dep.target);
				return value;
			},	
			set(newValue){//赋值的时候,调这个方法,newValue就是赋值的时候的新值
				if(newValue != value){
					//这里的this不是当前实例,但是要用到实例下的属性
					that.observer(newValue);//如果新赋值的值,是对象,那就要对新值也劫持一下,这样新值也有get和set方法了
					value = newValue;
					dep.notify();//通知所有人,数据更新了
				}
			}	
		})			
	}
}

//发布订阅
class Dep{
	constructor(){
		//订阅的数组
		this.subs = [];
	}
	//添加订阅
	addSub(watcher){
		this.subs.push(watcher);
	}
	//通知
	notify(){
		this.subs.forEach(watcher => watcher.update())
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值