Js实现双向绑定

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8" />
		<title></title>
	</head>
	<body>
		输入姓名:<input type="text" class="name">
		<br>
		输入年龄:<input type="text" class="age">
		<div>
			<p>姓:<span></span> </p>
			<p>名:<span></span> </p>
			<p>年龄:<span></span> </p>
		</div>
		<script src="./js/model.js"></script>
		<script>
			// Dom元素对象
			var doms = {
				// 获取所有span标签
				sp: document.querySelectorAll('span'),
				// 获取姓名输入框元素
				name: document.querySelector('.name'),
				// 获取年龄输入框元素
				age: document.querySelector('.age')
			}
			// 用户信息对象
			var user = {
				name: '张三',
				age: 18
			}
			// 监听输入框变化
			doms.name.addEventListener('change',function(){
				// 将输入框内容赋值给user对象
				user.name = this.value
			})
			doms.age.addEventListener('change',function(){
				user.age = this.value
			})
			// 用upDate方法,为对象的每一个属性添加get和set方法
			upDate(user)
			// 用getFunc方法执行函数,获取依赖属性的函数
			getFunc(setFirstName)
			getFunc(setLastName)
			getFunc(setAge)
			// setFirstName()
			// setLastName()
			// setAge()
			// 设置姓
			function setFirstName(){
				doms.sp[0].innerText = user.name.substr(0,1)
			}
			// 设置名
			function setLastName(){
				doms.sp[1].innerText = user.name.substr(1)
			}
			// 设置年龄
			function setAge(){
				doms.sp[2].innerText = user.age
			}
		</script>
	</body>
</html>
// 传入对象
function upDate(obj){
	// 遍历对象的每一个属性
	for(const key in obj ){
		// 获取对象的值
		let internalValue = obj[key]
		// 存放依赖该属性的方法
		let funcList = []
		Object.defineProperty(obj,key,{
			// 获取该属性时执行的函数
			get(){
				// 判断是否有函数使用了该属性和函数列表是否已经存在此函数
				if(window._foo && !funcList.includes(window._foo)){
					// 将函数放入函数数组
					funcList.push(window._foo)
				}
				// 返回该属性的值
				return internalValue
			},
			// 设置该属性时执行的方法:参数是设置的新值
			set(val){
				// 将属性的值变为新值
				internalValue = val
				// 循环遍历执行每一个依赖该属性的函数
				for (var i = 0; i < funcList.length; i++) {
					funcList[i]()
				}
			}
		})
	}
}
// 搜集依赖属性的函数
function getFunc(fn){
	// 将函数赋值给window全局变量
	window._foo = fn
	// 执行函数
	fn()
	// 将全局变量设置为null
	window._foo = null
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值