前言
单例模式是一种常用的设计模式,它确保一个类只有一个实例,并提供一个全局访问点来获取这个实例。在 JavaScript 中,单例模式可以通过代理实现,代理模式是一种设计模式,它允许你将一个对象的操作委托给另一个对象。
代理实现单例模式
// 代理实现单例模式
function ProxySingletonFactory(fn) {
let instance = null;
return function (...args) {
if (!instance) {
instance = fn.apply(this, args);
}
return instance;
};
}
// 测试
const createSingleDog = ProxySingletonFactory(function () {
console.log("创建狗");
return "dog";
});
console.log(createSingleDog());
console.log(createSingleDog());
console.log(createSingleDog());
但是如果是异步调用呢;
我们如何对类进行封装实现单例全局唯一
class A {
constructor() {
console.log("初始化A");
}
}
function singlton(classname) {
let ins;
const proxy = new Proxy(classname, {
construct(target, args) {
if (ins) {
return ins;
}
ins = Reflect.construct(target, args);
return ins;
},
});
proxy.prototype.constructor = proxy;
return proxy;
}
const AProxy = singlton(A);
export default return new AProxy();
总结
通过代理实现单例模式,可以确保一个类只有一个实例,并提供一个全局访问点来获取这个实例。这种方式可以避免全局变量污染,并且可以在需要的时候才创建实例,从而提高性能。