javascript名不虚传的单例模式

介绍
  • 系统中被唯一使用
  • 一个类只有一个实例
示例
  • 登录框
  • 购物车
js版说明
  • 单例模式需要用到java的特性(私有属性private),而es6中没有,可以借助ts来实现private
  • private:类外部不能new,只能在类内部new,这种属性在UML类图中用“-”表示
js单例模式代码
class SingleObject {
    login() {
        console.log('login...')
    }
}
SingleObject.getInstance = (function () {
    let instance
    return function () {
        if (!instance) {
            instance = new SingleObject();
        }
        return instance
    }
})()

// 测试代码
let obj1 = SingleObject.getInstance()
obj1.login()
let obj2 = SingleObject.getInstance()
obj2.login()
console.log(obj1 === obj2) // true

1.以上代码,不通过new SingleObject()直接实例化,用SingleObject.getInstance()实例,保证了SingleObject类只实例化一次,从而使得obj1 === obj2
2.注意严格上来说SingleObject在类外是不可以,js版本只能通过口头约束,即不能在类外直接new SingleObject()来实例
3.为了避免口头约束带来的问题,除了用ts技术的private属性外,可以通过es6的模块方式来处理。

利用模块化处理private问题

class SingleObject {
    constructor() {
       ...
    }}

// 返回单例
let getSingleObject = (function () {
    let get
    return function () {
        if (!get) {
            get = new SingleObject();
        }
        return get
    }
})()

export default getSingleObject

以上代码中,只暴露getSingleObject方法,利用返回函数闭包+模块化实现了不能、不直接new SingleObject的途径

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值