發佈訂閱模式源碼實現

var shoeObj = {}; // 定義發佈者
shoeObj.list = []; // 緩存列表 存放訂閱者回調函數
        
// 增長訂閱者
shoeObj.listen = function(key,fn) {
    if(!this.list[key]) {
        // 若是尚未訂閱過此類消息,給該類消息建立一個緩存列表
        this.list[key] = []; 
    }
    this.list[key].push(fn);  // 訂閱消息添加到緩存列表
}

// 發佈消息
shoeObj.trigger = function(){
    var key = Array.prototype.shift.call(arguments); // 取出消息類型名稱
    var fns = this.list[key];  // 取出該消息對應的回調函數的集合

    // 若是沒有訂閱過該消息的話,則返回
    if(!fns || fns.length === 0) {
        return;
    }
    for(var i = 0,fn; fn = fns[i++]; ) {
        fn.apply(this,arguments); // arguments 是發佈消息時附送的參數
    }
};

// 小紅訂閱以下消息
shoeObj.listen('red',function(size){
    console.log("尺碼是:"+size);  
});

// 小花訂閱以下消息
shoeObj.listen('block',function(size){
    console.log("再次打印尺碼是:"+size); 
});
shoeObj.trigger("red",40);
shoeObj.trigger("block",42);
相關文章
相關標籤/搜索