【前端面试】js常用的设计模式

89 阅读2分钟

一切设计模式都是为了使代码高聚合,低解耦

1.装饰器模式
在优化旧代码,确保不影响旧代码逻辑时增加新的功能,经常使用。 举例:

 旧代码
 function Fn(){
     console.log(123)
     console.log(456)  // 要新增的代码,直接新增此行会改变原有逻辑
 }
 function newFn(){
     Fn();
     console.log(456)   抽离原有逻辑后再新增新逻辑。
 }

2.工厂模式
将实现同一件事的相同代码封装到一个函数里,用这个函数批量复制生产功能,将创建对象的过程单独封装。举例: 创建一个关于人的构造函数

function Person(name,age,type){
    this.name = name;
    this.age = age
}
const person1 = new Person('小张',18)
const person2 = new Person('小Li',16)
也可通过传递参数进行扩展 根据type不同,构造不同属性

也可称呼为构造器模式。Person这种就叫构造器
3.单例模式
只有一个实例,可以全局访问到,避免频繁创建销毁实例,减少内存占用。举例: Jquery,或者用变量将实例或dom节点储存下来供全局访问
4.发布订阅模式
发布订阅模式,又叫观察者模式。其实就是定义了一种一对多的依赖关系。多个观察者去监听一个目标对象,当目标对象状态变化时通知所有观察者进行更新。比如emit on,和vue的MVVM原理

  class Publisher{
      construstor(){
          this.subs = []
      }
      addSubs(fn){ 
          this.subs.push(fn)   // 相当于订阅 On
      }
      notify(){
          this.subs.forEach(item => {
              item.update(this)   //相当于发布 emit
          })
      }
  }
  class obsever(){
      update(){
          console.log(我更新了)
      }
  }
  const pub = new Publishe()
  const ob = new Obsever()
pub.addSub(ob)
pub.notify()

5.策略模式
基于算法的封装 举例

 const fnMap = {
     0:this.get(),
     1:this.set();
 }
 fnMap[type].bind(this)
 通过不同的参数执行不同方法,可用Map对象语法进行封装。

6.建造者模式
使用场景:当一个构造函数的参数较多时使用,根据参数进行分类然后分别构建各个部分,最后挂载到对象的属性上。 典型的例子Vue框架,通过不同Vue router Vuex axios实现Vue的各项功能。