前言

单例模式是一种常用的设计模式,它确保一个类只有一个实例,并提供一个全局访问点来获取这个实例。在 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();

总结

通过代理实现单例模式,可以确保一个类只有一个实例,并提供一个全局访问点来获取这个实例。这种方式可以避免全局变量污染,并且可以在需要的时候才创建实例,从而提高性能。