【js篇】- 3、使用代理实现单例

74 阅读1分钟

本文属于个人见解,不保证准确性。 下面介绍使用js内置对象Proxy创建简单的单例。

为什么可以使用Proxy创建单例对象?

首先,new Proxy(target, handler)的target是任何类型的对象,js的对象(Object)包括普通对象、数组、函数,js中的Class是一种特殊的函数,因此Proxy可以对Class进行拦截;

其次,通过new去创建对象的时候会触发Class构造函数的执行,因此,通过new创建单例的时候,我们可以使用Proxy对Class的constructor函数进行拦截处理,返回一个单例。

具体代码如下:

封装一个返回单例的函数createSingleTon,该函数通过传入一个Class,返回Class的单例。

// singleton.mjs
export const createSingleTon = (className) => {
  let instance;
  return new Proxy(className, {
    construct(target, args) {
      if (!instance) {
        instance = new target(...args);
      }
      return instance;
    }
  })
};

举例:

1、创建一个Test类的单例

// test.mjs
import { createSingleTon } from './singleton.mjs';

class Test {
  constructor() {
    console.log('test created');
  }
}

export const testSingleTon = createSingleTon(Test);

2、在main.mjs文件中引入Test类的单例

// main.mjs
import { testSingleTon } from './test.mjs';

const t1 = new testSingleTon();
const t2 = new testSingleTon();

console.log(t1 === t2);  // true