加入收藏 | 设为首页 | 会员中心 | 我要投稿 PHP编程网 - 黄冈站长网 (http://www.0713zz.com/)- 数据应用、建站、人体识别、智能机器人、语音技术!
当前位置: 首页 > 运营中心 > 建站资源 > 优化 > 正文

JavaScript 的一些常用设计模式

发布时间:2019-08-20 03:46:49 所属栏目:优化 来源:xianshannan
导读:副标题#e# 设计模式是前人解决某个特定场景下对而总结出来的一些解决方案。可能刚开始接触编程还没有什么经验的时候,会感觉设计模式没那么好理解,这个也很正常。有些简单的设计模式我们有时候用到,不过没意识到也是存在的。 学习设计模式,可以让我们在

原先有个功能是实现字符串反转(reverseString),那么在不改变 reverseString 的现有逻辑,我们可以使用缓存代理模式实现性能的优化,当然也可以在值改变的时候去处理下其他逻辑,如 Vue computed 的用法。

  1. function reverseString(str) { 
  2.   return str 
  3.     .split('') 
  4.     .reverse() 
  5.     .join('') 
  6. const reverseStringProxy = (function() { 
  7.   const cached = {} 
  8.   return function(str) { 
  9.     if (cached[str]) { 
  10.       return cached[str] 
  11.     } 
  12.     cached[str] = reverseString(str) 
  13.     return cached[str] 
  14.   } 
  15. })() 

订阅发布模式

订阅发布使前端常用的数据通信方式、异步逻辑处理等等,如 React setState 和 Redux 就是订阅发布模式的。

但是要合理的使用订阅发布模式,否则会造成数据混乱,redux 的单向数据流思想可以避免数据流混乱的问题。

例子

  1. class Event { 
  2.   constructor() { 
  3.     // 所有 eventType 监听器回调函数(数组) 
  4.     this.listeners = {} 
  5.   } 
  6.   /** 
  7.    * 订阅事件 
  8.    * @param {String} eventType 事件类型 
  9.    * @param {Function} listener 订阅后发布动作触发的回调函数,参数为发布的数据 
  10.    */ 
  11.   on(eventType, listener) { 
  12.     if (!this.listeners[eventType]) { 
  13.       this.listeners[eventType] = [] 
  14.     } 
  15.     this.listeners[eventType].push(listener) 
  16.   } 
  17.   /** 
  18.    * 发布事件 
  19.    * @param {String} eventType 事件类型 
  20.    * @param {Any} data 发布的内容 
  21.    */ 
  22.   emit(eventType, data) { 
  23.     const callbacks = this.listeners[eventType] 
  24.     if (callbacks) { 
  25.       callbacks.forEach((c) => { 
  26.         c(data) 
  27.       }) 
  28.     } 
  29.   } 
  30.  
  31. const event = new Event() 
  32. event.on('open', (data) => { 
  33.   console.log(data) 
  34. }) 
  35. event.emit('open', { open: true }) 

观察者模式

观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个目标对象,当这个目标对象的状态发生变化时,会通知所有观察者对象,使它们能够自动更新。

Vue 的数据驱动就是使用观察者模式,mbox 也是使用观察者模式。

例子

模仿 Vue 数据驱动渲染模式(只是类似,简单的模仿)。

首先使用 setter 和 getter 监听到数据的变化:

  1. const obj = { 
  2.   data: { description: '' }, 
  3.  
  4. Object.defineProperty(obj, 'description', { 
  5.   get() { 
  6.     return this.data.description 
  7.   }, 
  8.   set(val) { 
  9.     this.data.description = val 
  10.   }, 
  11. }) 

(编辑:PHP编程网 - 黄冈站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读