js单例模式

整个项目运行期间只会在使用的时候被实例化一次。在其他语言中使用私有的构造方法或初始化方法,来保证实例不会被初始化多次。但是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

这是一种比较好用的单例模式。可以安全的在代码中使用了。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 前端开发工程师必备系列-几个简单的JS单例模式 JavaScript单例模式 1. 单例模式 单例模式(Singl...
    WEB开发李家靖阅读 583评论 1 0
  • 1. 常见实现单例 要实现一个标准的单例模式并不复杂,无非是用一个变量来标志当前是否已经为某个类创建过对象,如果是...
    rocneal阅读 1,326评论 0 0
  • 1、前端的JavaScript单例模式 单例模式是非常常用的设计模式,前端的JavaScript中单例模式代码可能...
    海上名月阅读 7,641评论 0 1
  • 系统中被唯一使用一个类只有一个实例由于js没有高级语言java、c#的私有特性,所以不要直接new,要通过静态方法...
    事在人为s阅读 491评论 0 1
  • 单例模式 在面向对象语言中,调用一个类的方法之前,必须先将这个类实例化,才能调用类方法。 单例模式能使得我们不需要...
    谢大见阅读 11,703评论 0 0