SOURCE

// 观察者设计模式(发布订阅模式)
// 发布者
let shopObj = {};
// 商品列表
shopObj.list = [];
// 订阅方法 (根据用户的订阅进行用户分组)
shopObj.listen = function(key, fn) {
  if(!this.list[key]) { // 如果没有 就给一个初始列表
    this.list[key] = [];
  }
  shopObj.list[key].push(fn); // 往特定的商品列表中添加订阅
}
// 发布消息方法
shopObj.publish = function(key) {
  let fns = this.list[key]; // 往特定的(某个商品)列表添加发布消息
  for(let i=0, fn; fn = fns[i++];) {
    // 执行订阅的fn arguments: js内置对象,存储所有的实参
    fn.apply(this, arguments);
  }
}
// A添加订阅
shopObj.listen('huawei', function(brand, model){
  console.log(`A订阅: ${brand}的${model}`);
})
// B添加订阅
shopObj.listen('apple', function(brand, model){
  console.log(`B订阅: ${brand}的${model}`);
})
// 商家发布消息
shopObj.publish('huawei', 'P30');
shopObj.publish('apple', 'iphone 12');
console 命令行工具 X clear

                    
>
console