采用proxy代理,或者控制new的时机,通过调用特定的方法来new,new的时候判断是否已经new过,但此方法不能往原型上追加东西。
代码语言:javascript复制export function singleton(className) {
let ins;
// 通过代理,解决不能往原型追加方法问题
return new Proxy(className, {
construct(target, args) {
if (!ins) {
ins = new target(...args);
}
return ins;
}
})
// 此方法不能往原型追加方法
// return class {
// constructor(...args) {
// if (!ins) {
// ins = new className(...args);
// }
// return ins;
// }
// }
}
class Notice {
}
export default singleton(Notice);
const notice = new Notice();
当然,除上述方案外,还有其他方案,需Notice类内再写一个getInstance方法,方法内部即:
代码语言:javascript复制static _ins; //实例
getInstance(name) {
if (!this._ins) {
return this._ins = new Notice();
}
return this._ins;
}
这样的话,外部调用的时候,统一都不采用new,而是直接调用notice.getInstance()方法,但是此方法会有一个风险问题,即:如果大家协同开发时,不能保证大家都采用getInstance方法进行new,可能就会有小伙伴直接new了,进而导致了不是单列模式了。