单例模式

使用代理实现单例模式

// singleton.js
export function singleton(classFn) {
    let instance = null;
    const proxy = new Proxy(classFn, {
        constructor(target, args) {
            if (!instance) {
                instance = Reflect.constructor(target, args);
            }
            return instance
        }
    })
    classFn.prototype.constructor = proxy;
    return proxy;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
// fn.js
import { singleton } from './singleton';

class Fn {
    constructor() {
        console.log('Fn 实例');
    }
}

export default singleton(Fn);
1
2
3
4
5
6
7
8
9
10
import Fn from './fn';

const ins1 = new Fn();
const ins2 = new ins1.constructor();
console.log(ins1 === ins2); // true
1
2
3
4
5

以上代码主要是为了防止外部拿到实例的constructor后,再通过new ins1.constructor创建出另一个实例导致产生两个不同的实例。