Singleton模式指的是调用一个类,任何时候返回的都是同一个实例。

对于Node来说,模块文件可以看成是一个类。怎么保证每次执行这个模块文件,返回的都是同一个实例呢?

很容易想到,可以把实例放到顶层对象global

// mod.js
function A() {
this.foo = 'hello';
} if (!global._foo) {
global._foo = new A();
} module.exports = global._foo;

然后,加载上面的mod.js

var a = require('./mod.js');
console.log(a.foo);

上面代码中,变量a任何时候加载的都是A的同一个实例。

但是,这里有一个问题,全局变量global._foo是可写的,任何文件都可以修改。

var a = require('./mod.js');
global._foo = 123;

上面的代码,会使得别的脚本加载mod.js都失真。

为了防止这种情况出现,我们就可以使用Symbol。

// mod.js
const FOO_KEY = Symbol.for('foo'); function A() {
this.foo = 'hello';
} if (!global[FOO_KEY]) {
global[FOO_KEY] = new A();
} module.exports = global[FOO_KEY];

上面代码中,可以保证global[FOO_KEY]不会被无意间覆盖,但还是可以被改写。

var a = require('./mod.js');
global[Symbol.for('foo')] = 123;

如果键名使用Symbol方法生成,那么外部将无法引用这个值,当然也就无法改写。

// mod.js
const FOO_KEY = Symbol('foo');
function A() {
this.foo = 'hello';
} if (!global[FOO_KEY]) {
global[FOO_KEY] = new A();
} module.exports = global[FOO_KEY];

上面代码将导致其他脚本都无法引用FOO_KEY。但这样也有一个问题,就是如果多次执行这个脚本,每次得到的FOO_KEY都是不一样的。虽然Node会将脚本的执行结果缓存,一般情况下,不会多次执行同一个脚本,但是用户可以手动清除缓存,所以也不是完全可靠。

参考链接:http://es6.ruanyifeng.com/#docs/symbol

JavaScript 单例模式实现的更多相关文章

  1. javascript单例模式的理解

    javascript单例模式的理解 阅读目录 理解单例模式 使用代理实现单例模式 理解惰性单例 编写通用的惰性单例 单例模式使用场景 回到顶部 理解单例模式 单例模式的含义是: 保证一个类只有一个实例 ...

  2. 浅析Javascript单例模式

    定义 保证一个类仅有一个实例,并提供一个访问它的全局访问点 .就想我们在开发中有些对象只需要一个,例如window对象. 1. 实现单例模式 var Singleton = function( nam ...

  3. [转] JavaScript 单例模式

    定义 确保一个类仅有一个实例,并提供一个访问它的全局访问点. 单例模式使用的场景 比如线程池.全局缓存等.我们所熟知的浏览器的window对象就是一个单例,在JavaScript开发中,对于这种只需要 ...

  4. Javascript单例模式概念与实例

    前言 和其他编程语言一样,Javascript同样拥有着很多种设计模式,比如单例模式.代理模式.观察者模式等,熟练运用Javascript的设计模式可以使我们的代码逻辑更加清晰,并且更加易于维护和重构 ...

  5. 轻松掌握:JavaScript单例模式

    单例模式 定义:保证一个对象(类)仅有一个实例,并提供一个访问它的全局访问点: 实现原理:利用闭包来保持对一个局部变量的引用,这个变量保存着首次创建的唯一的实例; 主要用于:全局缓存.登录浮窗等只需要 ...

  6. 深入理解 JavaScript 单例模式 (Singleton Pattern)

    概念 单例模式,也叫单子模式,是一种常用的软件设计模式.在应用这个模式时,单例对象的类必须保证只有一个实例存在. 核心:确保只有一个实例,并提供全局访问. 实现思路 一个类能返回对象一个引用(永远是同 ...

  7. javascript单例模式及开发实践

    定义: 保证一个对象(类)仅有一个实例,并提供一个访问它的全局访问点: 实现原理: 利用闭包来保持对一个局部变量的引用,这个变量保存着首次创建的唯一的实例; 主要用于: 全局缓存.登录浮窗等只需要唯一 ...

  8. JavaScript单例模式

    一.什么是单例 意思是指获取的对象只有一份. 二.最通用的单例 任何时刻获取SingLeton.instance都是同一个对象 var SingLeton={ instance:{ property: ...

  9. javascript单例模式(懒汉 饿汉)

    第一种:懒汉模式 var Singleton=(function(){ var instantiated; //比较懒,在类加载时,不创建实例,因此类加载速度快,但运行时获取对象的速度慢 functi ...

随机推荐

  1. HDU -2524 矩形A + B

    找规律题,这种题目比较巧妙,要仔细观察找出规律 1. 假设只有一行,一共有n列,那么由一个小矩形构成的矩形个数为n, 由两个小矩形构成的矩形个数为 n - 1个 .... 由 n 个小矩形构成的矩形个 ...

  2. (转徐明吉)C#生成随机数

    private static char[] constant = { ', 'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p ...

  3. Jquery+css实现图片无缝滚动轮播

    Today,在XX学院的教学视频中,偶尔看到了Jquery+css实现图片无缝滚动轮播视频教程,虽然以前已写过类似的,但是我感觉他学的比较精简.为了方便以后做项目时直接拷贝,特地写出来,顺便和大家分享 ...

  4. WebBrowser控件使用相关

    修改WebBrowser控件的内核解决方案 http://www.cnblogs.com/sung/p/3391264.html C#中的WebBrowser控件的使用 http://www.cnbl ...

  5. gis基本概念之"投影变换"-浅谈

    目录 1,概述 2,常用的投影方法有 正解变换 反解变换 数值变换 3,定义投影 4,投影变换 1,栅格(投影变换) 2,要素(投影变换) 注意 1,概述 因为GIS描述的是位于地球表面的信息,所以根 ...

  6. PHP 异常处理

    PHP 异常处理 异常用于在指定的错误发生时改变脚本的正常流程. 异常是什么 PHP 5 提供了一种新的面向对象的错误处理方法. 异常处理用于在指定的错误(异常)情况发生时改变脚本的正常流程.这种情况 ...

  7. 使用Scanner来解析文件

    前面的流是全部流进来再处理,空间换取时间 我们用Scanner来解析文件,先处理再输入数据,时间换取空间 两种方法 Scanner scanner1=new Scanner(file1); for(; ...

  8. [java] Java NIO 学习笔记 I

    如今在运行时优化方面,JVM 已然前进了一大步.现在 JVM 运行字节码的速率已经接近本地 编译代码,借助动态运行时优化,其表现甚至还有所超越.这就意味着,多数 Java 应用程序已不 再受 CPU ...

  9. DIY一款C/C++编译器

    一. 原理 1.1 记事本编程 我们用记事本新建一个文件,文件后缀改成.c,例如文件名叫做"1.c",在文件里写上最简单的C或者C++代码, #include<stdio.h ...

  10. 《Linux内核分析》 week5作业-system call中断处理过程

    一.使用gdb跟踪分析一个系统调用内核函数 1.在test.c文件中添加time函数与采用c语言内嵌汇编的time函数.具体实现请看下图. 2.然后在main函数中添加MenuConfig函数,进行注 ...