<span id="mktg5"></span>

<i id="mktg5"><meter id="mktg5"></meter></i>

        <label id="mktg5"><meter id="mktg5"></meter></label>
        最新文章專題視頻專題問答1問答10問答100問答1000問答2000關鍵字專題1關鍵字專題50關鍵字專題500關鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關鍵字專題關鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
        問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
        當前位置: 首頁 - 科技 - 知識百科 - 正文

        JavaScript原生實現觀察者模式的示例

        來源:懂視網 責編:小采 時間:2020-11-27 22:23:42
        文檔

        JavaScript原生實現觀察者模式的示例

        JavaScript原生實現觀察者模式的示例:觀察者模式又叫做發布訂閱模式,它定義了一種一對多的關系,讓多個觀察者對象同時監聽某一個主題對象,這個主題對象的狀態發生改變時就會通知所有觀察著對象。 它是由兩類對象組成,主題和觀察者,主題負責發布事件,同時觀察者通過訂閱這些事件來觀察該主體
        推薦度:
        導讀JavaScript原生實現觀察者模式的示例:觀察者模式又叫做發布訂閱模式,它定義了一種一對多的關系,讓多個觀察者對象同時監聽某一個主題對象,這個主題對象的狀態發生改變時就會通知所有觀察著對象。 它是由兩類對象組成,主題和觀察者,主題負責發布事件,同時觀察者通過訂閱這些事件來觀察該主體

        觀察者模式又叫做發布訂閱模式,它定義了一種一對多的關系,讓多個觀察者對象同時監聽某一個主題對象,這個主題對象的狀態發生改變時就會通知所有觀察著對象。 它是由兩類對象組成,主題和觀察者,主題負責發布事件,同時觀察者通過訂閱這些事件來觀察該主體,發布者和訂閱者是完全解耦的,彼此不知道對方的存在,兩者僅僅共享一個自定義事件的名稱。

        在Nodejs中通過EventEmitter實現了原生的對于這一模式的支持。

        在JavaScript中事件監聽機制就可以理解為一種觀察者模式。通過onclick進行事件綁定,然后通過交互行為進行觸發或者事件主動觸發。

        下面給出一個JS自定義的PubSub,仔細閱讀下面這段代碼有助于你理解觀察者模式。

        一、定義觀察者類Pubsub

        /* Pubsub */
         function Pubsub(){
         //存放事件和對應的處理方法
         this.handles = {};
         }

        二、實現事件訂閱on

        //傳入事件類型type和事件處理handle
         on: function (type, handle) {
         if(!this.handles[type]){
         this.handles[type] = [];
         }
         this.handles[type].push(handle);
         }

        三、實現事件發布emit

        emit: function () {
         //通過傳入參數獲取事件類型
         var type = Array.prototype.shift.call(arguments);
         if(!this.handles[type]){
         return false;
         }
         for (var i = 0; i < this.handles[type].length; i++) {
         var handle = this.handles[type][i];
         //執行事件
         handle.apply(this, arguments);
         }
         }

        需要說明的是Array.prototype.shift.call(arguments)這句代碼,arguments對象是function的內置對象,可以獲取到調用該方法時傳入的實參數組。

        shift方法取出數組中的第一個參數,就是type類型。

        四、實現事件取消訂閱off

        off: function (type, handle) {
         handles = this.handles[type];
         if(handles){
         if(!handle){
         handles.length = 0;//清空數組
         }else{
         for (var i = 0; i < handles.length; i++) {
         var _handle = handles[i];
         if(_handle === handle){
         handles.splice(i,1);
         }
         }
         }
         }
         }

        完整代碼:

        /* Pubsub */
         function Pubsub(){
         //存放事件和對應的處理方法
         this.handles = {};
         }
         Pubsub.prototype={
         //傳入事件類型type和事件處理handle
         on: function (type, handle) {
         if(!this.handles[type]){
         this.handles[type] = [];
         }
         this.handles[type].push(handle);
         },
         emit: function () {
         //通過傳入參數獲取事件類型
         var type = Array.prototype.shift.call(arguments);
         if(!this.handles[type]){
         return false;
         }
         for (var i = 0; i < this.handles[type].length; i++) {
         var handle = this.handles[type][i];
         //執行事件
         handle.apply(this, arguments);
         }
         },
         off: function (type, handle) {
         handles = this.handles[type];
         if(handles){
         if(!handle){
         handles.length = 0;//清空數組
         }else{
         for (var i = 0; i < handles.length; i++) {
         var _handle = handles[i];
         if(_handle === handle){
         handles.splice(i,1);
         }
         }
         }
         }
         }
         }

        五、測試

        var p1 = new Pubsub();
         p1.on('mm', function (name) {
         console.log('mm: '+ name);
         });
         p1.emit('mm','哈哈哈哈');
        console.log('===============');
         var p2 = new Pubsub();
         var fn = function (name) {
         console.log('mm2: '+ name);
         };
         var fn2 = function (name) {
         console.log('mm222: '+ name);
         };
         p2.on('mm2', fn);
         p2.on('mm2', fn2);
         p2.emit('mm2','哈2哈2哈2哈2');
         console.log('-------------');
        p2.off('mm2', fn);
         p2.emit('mm2','哈2哈2哈2哈2');
         console.log('-------------');
        p2.off('mm2');
         p2.emit('mm2','哈2哈2哈2哈2');
         console.log('-------------');

        以上這篇JavaScript原生實現觀察者模式的示例就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持腳本之家。

        聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

        文檔

        JavaScript原生實現觀察者模式的示例

        JavaScript原生實現觀察者模式的示例:觀察者模式又叫做發布訂閱模式,它定義了一種一對多的關系,讓多個觀察者對象同時監聽某一個主題對象,這個主題對象的狀態發生改變時就會通知所有觀察著對象。 它是由兩類對象組成,主題和觀察者,主題負責發布事件,同時觀察者通過訂閱這些事件來觀察該主體
        推薦度:
        標簽: js 示例 實例
        • 熱門焦點

        最新推薦

        猜你喜歡

        熱門推薦

        專題
        Top
        主站蜘蛛池模板: 午夜视频免费成人| 免费成人福利视频| 亚洲精品无码AV中文字幕电影网站| 亚洲国产日韩女人aaaaaa毛片在线| 无码午夜成人1000部免费视频| 亚洲五月综合缴情在线观看| 国产成人1024精品免费| 亚洲人成电影在线播放| 久久高潮一级毛片免费| 亚洲精品无码专区2| 一级做a爱过程免费视频高清| 亚洲成片观看四虎永久| 一道本不卡免费视频| 亚洲天堂中文字幕在线| 你好老叔电影观看免费| 亚洲成av人片在www鸭子| 处破痛哭A√18成年片免费| 亚洲Av永久无码精品一区二区| 在线看片无码永久免费aⅴ| 亚洲a∨无码精品色午夜| 亚洲精品无码永久在线观看| 在线观看免费无码专区| 国产成人综合久久精品免费| 亚洲色成人网一二三区| 97在线免费视频| 亚洲国产天堂久久综合网站 | 久久久无码精品亚洲日韩京东传媒| 久久久久国产精品免费看| 亚洲精品福利在线观看| 好先生在线观看免费播放| 自拍偷自拍亚洲精品播放| 久久午夜夜伦鲁鲁片免费无码| 亚洲精品电影在线| 免费黄色网址入口| 亚洲三级在线观看| 免费一级毛片正在播放| 永久免费AV无码网站国产| 亚洲国产精品白丝在线观看 | 亚洲国产黄在线观看| 性xxxx视频免费播放直播| 亚洲熟妇无码一区二区三区|