日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

JavaScript发布订阅者模式

發布時間:2025/4/5 javascript 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 JavaScript发布订阅者模式 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

假如你要建立一個網站,通常來說會有許多用戶。你作為一名管理者,有時候需要將重要的消息發布給你的用戶。在軟件開發領域,開發此功能往往用到發布訂閱者模式。下面我以簡單的javascript來說明。

  • 定義發布者類。發布者最基本的兩個屬性:發送的消息,發送的人
  • function Publisher() {this.observers =[]; // 存儲需要發布消息的人this.state="hello" // 發送的消息 } 復制代碼

    除此之外,一個Publisher還需要有能夠接納新的訂閱消息的人的功能,或者刪除某個訂閱者的功能,同時需要能夠將消息發送出去的功能。

    // 新增訂閱者功能 Publisher.prototype.addUser=function(obj) {const nameList= this.observers.map(item=>{return item.name;})if(nameList.indexOf(obj.name) < 0) {this.observers.push(obj)}return this; } //刪除訂閱者功能 Publisher.prototype.deleteUser=function(obj){let index = -1this.observers.forEach((item,key)=>{if(item.name === obj.name){index = key}})if(index !== -1) {this.observers.splice(index,1)}return this } // 通知訂閱者功能 Publisher.prototype.noticeUser=function(data){ this.observers.forEach((item)=>{item.update(data)}) } 復制代碼

    值得注意的是,上述通知訂閱者的功能是通過遍歷this.observers 并調用每一個訂閱者的update方法。所以每一個訂閱者需要對應有update方法。每一個訂閱者的類似結構如下:

    [{name:'張三',update:(data)=>{console.log(data)}},{name:'李四',update:(data)=>{console.log(data)}},... ] 復制代碼
  • 構造訂閱者對象,由于每一個訂閱者都有name屬性和update方法。最簡單的就是采用構造函數方法來實現
  • function Subscribe(name){this.name =name;this.update = function(data){console.log(data);}; } 復制代碼
  • 有了Subscribe模板,我們開始構造出每一個具體的訂閱者實例出來。
  • let lisi = new Subscribe('lisi') let xiaoming = new Subscribe('xiaoming') 復制代碼
  • 將構造的訂閱人lisi 和 xiaoming 加入到發布者對象的observer中
  • let pb = new Publisher() pb.addUser(lisi) pb.addUser(xiaoming) 復制代碼
  • 發布者需要發布消息時:
  • pb.noticeUser("hello") 復制代碼

    至此一個最簡單的發布訂閱者模式實現了,這里還有兩點優化建議。
    第一,上述構造出來的lisi,xiaoming都會自動有update方法,并且update的行為都是一樣的,如果需要例如xiaoming的update與其他不同,只需要重新定義即可

    xiaoling.update=(data)=>{console.log("hello"+data)} pb.addUser(xiaoling) 復制代碼

    第二, 發布者需要手動調用pb.noticeUser()去通知state消息,可以做到state變動了自動去調用pb.noticeUser()嗎?可以的,此時 Object.defineProperty()就派上用場了

    let pb = new Publisher() Object.defineProperty(pb,'state',{set:function(newVal,) {let a = thisdebuggerpb.noticeUser(newVal) } }) pb.addUser(lisi) pb.addUser(xiaoming) pb.state = '123' //pb.noticeUser() 復制代碼

    如果state變化了將自動觸發pb.noticeUser(),實現自動通知功能,是不是有點Vue原理既視感!

    總結

    以上是生活随笔為你收集整理的JavaScript发布订阅者模式的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 久草免费在线观看 | 人人妻人人澡人人爽 | 欧美 亚洲 另类 偷偷 自拍 | 日本三级吹潮 | 免费的一级片 | 久草免费在线视频观看 | 成人午夜在线免费观看 | 国产91美女视频 | av在线免 | 天天摸天天 | 国产三级不卡 | 欧美视频免费在线 | 欧美性猛交xxxx黑人交 | 国产精品99无码一区二区 | 人人爱超碰 | 成年人免费视频播放 | 国产1区2区在线观看 | 婷婷五月情 | 中国国产毛片 | a级在线观看网站 | 黄色同人网站 | 国精品无码人妻一区二区三区 | 欧美色图在线播放 | 国产主播毛片 | 国产第一页精品 | 伊人黄色网| 欧美日韩免费在线观看 | 无码人妻av免费一区二区三区 | hd丰满圆润的女人hd | 国产高清在线视频 | 麻豆视频在线观看免费网站 | 伊人精品在线观看 | 亚洲午夜福利在线观看 | 国产久精品 | 婷婷色av| 91免费视频免费版 | 成人麻豆视频 | 人人爽人人爽人人片 | 91香蕉久久 | 亚洲免费观看高清 | 中文字幕码精品视频网站 | 亚洲美女高潮久久久 | 美女一区二区三区四区 | 潮喷失禁大喷水无码 | 欧美亚洲另类视频 | 亚洲AV无码国产精品国产剧情 | 亚洲视频在线看 | 国产精品久久久久久免费 | 国产一级α片 | 蜜桃视频在线观看一区二区 | 91成人在线看 | 午夜爱爱网| 日韩欧美国产另类 | 青青草成人在线 | 日本少妇性生活 | 久久久久久网 | 亚洲视频在线免费播放 | 91色视频在线观看 | 国产熟妇搡bbbb搡bbbb | 中文文字幕一区二区三三 | 最新av网址在线观看 | 亚洲日本护士毛茸茸 | 男人草女人| 人人入人人 | 精品国产亚洲AV | 中文字幕综合在线 | 欧美另类极品 | 一区二区三区波多野结衣 | 美女被c出白浆 | 国产精品不卡在线观看 | 日韩精品第三页 | 精品国产1区2区 | 午夜精品在线免费观看 | 大乳女喂男人吃奶 | 国产欧美综合一区二区三区 | 国产精品一区二区三区不卡 | 伊人青草 | 亚洲免费观看高清完整版在线 | 少妇一区二区三区 | 久久毛片网站 | 国产色片在线观看 | 成人免费公开视频 | 色悠悠网 | a视频免费看| 国产亚洲综合av | 四虎国产在线观看 | 美女av在线免费观看 | 亚洲人体一区 | 国产夫绿帽单男3p精品视频 | 伊人宗合 | 女的高潮流时喷水图片大全 | 亚洲av无码国产在丝袜线观看 | 九草影院 | 精品少妇无码av无码专区 | 欧美日韩在线影院 | 综合图区亚洲 | 国产欧美亚洲一区二区 | 插骚 | 亚洲激情欧美激情 |