整个项目运行期间只会在使用的时候被实例化一次。在其他语言中使用私有的构造方法或初始化方法,来保证实例不会被初始化多次。但是js中是没有这种私有方式的。如何你使用了ts那么就可以私有化构造方法来实现了。
当然js可以使用其他的方式来实现同样的功能。
方式一
通过模块化的方式,导出一个实例供其他使用。
class Video {}
const video = new Video();
export {
video
}
这样看起来整个系统只有一个实例。但是它有一个隐患,例如:
import {video} from './singleton.js';
const VideoClass = Object.getPrototypeOf(video).constructor;
const video2 = new VideoClass();
console.log(video === video2); // false
这样我们发现它被重新实例化了。
方式二
通过代理的方式:
function singleton(className) {
let instance;
return new Proxy(className, {
construct(target, args) {
if(!instance) {
instance = Reflect.construct(target, ...args);
// 或
// instance = new className(target, ...args);
}
return instance;
}
})
}
export default singleton;
在需要设置单例的类中这样使用如下:
import singleton from "./singleton";
class Video {}
export default singleton(Video);
在其他地方使用单例如下:
const v1 = Video();
const v2 = Video();
console.log(v1 === v2); // true
这是一种比较好用的单例模式。可以安全的在代码中使用了。