跳到主要内容

用代理实现单例模式

通用的单例模式函数:

singleton.js
function singleton(className) {
let ins = null;
const proxy = new Proxy(className, {
construct(target, args) {
if (!ins) {
ins = Reflect.construct(target, args);
}
return ins;
},
});
className.propotype.constructor = proxy;
return proxy;
}

要使用单例模式的类:

my-class-singleton.js
import { singleton } from './singleton.js';

class MyClass{
constructor(){
console.log('My Class')
}
}

const MyClassSingleton = singleton(MyClass);

export default new MyClassSingleton();

在具体的业务客户端使用:

main.js
import myClass from './my-class-singleton.js';

const myClass2 = new myClass();
console.log(myClass === myClass2);

const myClass3 = new myClass.constructor();
console.log(myClass === myClass3);