在 JavaScript 中实现单例
面向对象的软件设计模式,它确保给定类只实例化一次。在许多不同情况下它都很有用,例如创建应用程序中共享的全局对象。尽管JavaScript支持面向对象的编程,但为了实现这个模式,它并没有提供太多简单的选项。
最灵活且稍微高级的方法是使用。代理对象用于定义所谓的陷阱(traps)。陷阱是允许为某些操作(如属性查找、赋值等)定义自定义行为的方法。单例模式规定给定类只能有一个实例。因此,最有用的陷阱是handler.construct()
,new
运算符的陷阱。
事实证明,handler
本身只是一个对象。除了handler.constructor()
之外,我们可以使用处理程序来存储我们要实例化的类的唯一实例以及是否已经实例化。这样,我们可以为任何需要转换成单例的类创建一个可重用的处理程序对象,同时还能为其他可能需要自定义的操作提供附加的陷阱。
以下是一个将class
这里有一个简单的实际示例,以便更好地理解它的作用:
在上面的例子中,你可以看到MySingletonClass
实例化第二次时,没有任何变化。这是因为已经存在一个实例,所以它会返回该实例,而不是创建一个新对象。如前所述,这是一个singletonify
函数的基本实现。它可以被扩展以进一步修改行为,或者使用传递给构造函数的某些数据,在稍后调用中更新其持有的instance
。