JavaScript设计模式系列05_观察者模式(发布订阅)写的数据联动(类似于vue的数据绑定)

效果图:


代码:

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title></title>
    <style>
        *{ padding:0; margin:0}


    </style>
</head>
<body>
    <input type="text" id="txtId" ><br/>
    原始数字:<div id="d1"></div><br/>
    平方:<div id="d2"></div><br/>
    立方:<div id="d3"></div><br/>
    三个数之和:<div id="d4"></div><br/>
</body>
</html>

<script type="text/javascript" src="js/observer.js"></script>
<script type="text/javascript">

function  $(id) {
    return document.getElementById(id);
}
function  $create(tagName) {
    return document.createElement(tagName);
}

//创建一个发布订阅功能的对象
var txtObj={

}

observer.make(txtObj);

//第一个订阅对象d1
var d1 = {
    show:function(num){
        $("d1").innerHTML = num;
    }
}

var d2 = {
    show:function(num){
        $("d2").innerHTML = num*num;
    }
}


var d3 = {
    show:function(num){
        $("d3").innerHTML = num*num*num;
    }
}


var d4 = {
    show:function(num){
        $("d4").innerHTML = num+num*num+num*num*num;
    }
}

txtObj.addSubscriber(d1.show);
txtObj.addSubscriber(d2.show);
txtObj.addSubscriber(d3.show);
txtObj.addSubscriber(d4.show);

window.onload = function () {
    $("txtId").οnkeyup=function () {
        txtObj.publish(Number($("txtId").value));
    };
}

</script>

observer.js文件的内容
//1、定义观察者模式的对象(模板)
var observer = {
	//订阅
	addSubscriber:function(callback){
		this.subscribers.push(callback);
	},
	
	//退订
	removeSubscriber:function(callback){
		let index = this.subscribers.indexOf(callback);
		this.subscribers.splice(index,1);
	},
	
	//发布
	publish:function(what){
		for(let i in this.subscribers){
			if(typeof this.subscribers[i]==="function"){
				this.subscribers[i](what);
			}
		}
	},
	
	//让指定对象具备观察者的所有功能
	make:function(obj){
		for(let key in this){
			obj[key] = this[key];
		}
		obj.subscribers = [];
	}
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值