本文属于个人见解,不保证准确性。 下面介绍使用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