JavaScript 设计模式之单例模式

单例模式

常规单例

单例模式我们在日常使用中还是非常多的,比如常见的 jQuery,prototype,vue等都是属于单例模式,我们在使用 new Vue 的时候,返回的也会是同一个实例的,简单实现

javascript 复制代码
// 方式一
let Car = function () {
  const inst = this
  this.num = 0
  // todo: 其他内容
  Car = function () {
    return inst
  }
}

const miniCar = new Car()
const baoMa = new Car()

console.log(minicar === baoMa) // true

// 方式二

let Car;
  (function () {
    let intr = null
    Car = function Car() {
      if (intr) {
        return intr
      }
      intr = this
      this.name = "Car"
      // todo: 其他内容
    }
  }())

const miniCar = new Car()
const baoMa = new Car()

console.log(miniCar === baoMa) // true

// 方式三

let Car = function () {
  let inst = this
  this.name = "Car"
  // todo: 其他内容

  Car = function () { 
    return inst
  }
}

const miniCar = new Car()
const baoMa = new Car()

console.log(miniCar === baoMa) // true

// 方式四 隐式缓存

let Car = function () {
  if (Car.inst) return Car.inst
  this.name = "Car"
  // todo: 其他内容
  Car.inst = this
}

const miniCar = new Car()
const baoMa = new Car()

console.log(miniCar === baoMa) // true

正常我们在定义单例模式时应该注重一个自身的命名空间问题,很多时候,我们更多的可能是直接用一个对象来表达如这种:

javascript 复制代码
const Inst = {
  data: () => {
    // todo:
  },
  methods: {
  },
  ...
}

这样就拥有了一个自己的独立命名空间

模块分明

我们在使用时,尽可能的将模块分明开来

javascript 复制代码
const Project = {
  common: {
    // todo:
  },
  util: {
    // todo:
  },
  other: {
    // todo:
  },
  ...
}

// 使用

Project.util.xx

一个独立于其他的命名空间,其中的代码逻辑分离开来,独立模块,使得结构更加分明

单例对象

我们可以将一些对象定义为静态

javascript 复制代码
const Car = (function () {
  let opt = {
    SPEED: 100,
    PRICE:'12W'
  }
  return {
    get(key) {
      return opt[key] || null
    },
    set(key, value) {
      opt[key] = value
    }
  }
}())

console.log(Car.get('PRICE')) // 12W

这里我们只能使用 Car 中的 opt 定义的一些属性,这里我们定义了方法 set 来写操作,若不定义 set 就是我们说的静态了,只能读取了

惰性单例

延迟创建

javascript 复制代码
const LazySingle = (function () { 
  let _inst = null
  function Single() {
    return {
      methods: {
        // todo:
      },
      version:'1.0.0'
    }
  }
  return function () {
    if (!_inst) {
      _inst = new Single()
    }
    return _inst
  }
}())

let test = LazySingle().version
console.log(test) // 1.0.0

所谓单例,就是在一个文件或是一个系统中只能存在一个实例或是一个对象,尽可能的将各个模块的代码梳理得井井有条,更为规范

相关推荐
byzh_rc2 分钟前
[微机原理与系统设计-从入门到入土] 微型计算机基础
开发语言·javascript·ecmascript
Murrays6 分钟前
【React】01 初识 React
前端·javascript·react.js
helloCat9 分钟前
你的前端代码应该怎么写
前端·javascript·架构
ss27325 分钟前
RuoYi-App 本地启动教程
前端·javascript·vue.js
可触的未来,发芽的智生29 分钟前
完全原生态思考:从零学习的本质探索→刻石头
javascript·人工智能·python·神经网络·程序人生
炫饭第一名29 分钟前
Lottie-web 源码解析(一):从 JSON Schema 认识 Lottie 动画的本质📒
前端·javascript·css
前端_yu小白43 分钟前
react常用优化手段
前端·javascript·react.js·性能优化·usecallback·usememo
涵涵(互关)1 小时前
JavaScript 对大整数(超过 2^53 - 1)的精度丢失问题
java·javascript·vue.js
韩曙亮1 小时前
【Web APIs】浏览器本地存储 ① ( window.sessionStorage 本地存储 | window.localStorage 本地存储 )
服务器·前端·javascript·本地存储·localstorage·sessionstorage·web apis
qq_529599381 小时前
reactnative获取经纬度 获取此地信息 @react-native-community/geolocation
javascript·react native·react.js