js 单例模式笔记
单例指一个类只有一个实例,这个类自行创建这个实例。
利用对象字面量直接生成一个单例:
var singleton = {
prop: 1,
method: function(){
console.log(a); //1
}
}
严格的说对象字面量可能不算单例模式,生成单例是对象字面量的作用(已经被封装),而单例模式是一个设计模式(需要自行构思或设计)。
在类内部用new生成实例的单例模式:
var instance;
var foo = function(){
if(!instance){
instance = new Singleton();
}
return instance;
function Singleton(){
this.name = 'single';
this.method = function(){
console.log(this.name);
}
};
} var a = foo();
var b = foo();
a.method(); //single
console.log(a === b); //true
单例模式只要检测一个实例是否被生成。假如没有实例,则生成实例。假如已经生成则返回这个实例。保证这个类只有这一个实例。
由于hoisting,函数会提前声明,所以 singleton 函数放在哪都没所谓,但是每次调用都会声明函数singleton,可能会不够优雅。
由于new关键字是执行函数,同时this指向这个对象,所以可以判断类的this是否赋值给instance:
var instance;
var Singleton = function(){
if(instance){
return instance;
}
instance = this;
this.name = 'single';
this.method = function(){
console.log(this.name);
}
} var a = new Singleton();
var b = new Singleton();
a.method(); //single
console.log(a === b); //true
这个例子中,把instance指向了Singleton这个类,然后在类外部通过new来实例化,和上例中的new异曲同工。由于是通过修改this来达到检测是否执行过Singleton类,所以个人感觉不够语义化。
上面的例子用es6重构的写法。
类内部new生成单例:
var instance;
class foo{
static Singleton(){
if(!instance){
instance = new foo();
}
return instance;
}
method(){
this.name = 'single';
console.log(this.name);
}
} var a = foo.Singleton();
var b = foo.Singleton();
a.method(); //single
console.log(a === b); //true
修改this指向生成单例:
var instance;
class foo{
constructor(){
if(!instance){
this.Singleton();
}
return instance;
}
Singleton(){
instance = this;
this.name = 'single';
this.method = function(){
console.log(this.name);
}
}
} var a = new foo();
var b = new foo();
a.method(); //single
console.log(a === b); //true
当然除了这两种以外还有别的方式能实例化一个单例。
js 单例模式笔记的更多相关文章
- js学习笔记:webpack基础入门(一)
之前听说过webpack,今天想正式的接触一下,先跟着webpack的官方用户指南走: 在这里有: 如何安装webpack 如何使用webpack 如何使用loader 如何使用webpack的开发者 ...
- Vue.js学习笔记(2)vue-router
vue中vue-router的使用:
- js读书笔记
js读书笔记 基本类型的基本函数总结 1. Boolean() 数据类型 转换为true的值 转换为false的值 Boolean true false String 任何非空字符串 "&q ...
- React.js入门笔记
# React.js入门笔记 核心提示 这是本人学习react.js的第一篇入门笔记,估计也会是该系列涵盖内容最多的笔记,主要内容来自英文官方文档的快速上手部分和阮一峰博客教程.当然,还有我自己尝试的 ...
- JS 学习笔记--9---变量-作用域-内存相关
JS 中变量和其它语言中变量最大的区别就是,JS 是松散型语言,决定了它只是在某一个特定时间保存某一特定的值的一个名字而已.由于在定义变量的时候不需要显示规定必须保存某种类型的值,故变量的值以及保存的 ...
- node.js系列笔记之node.js初识《一》
node.js系列笔记之node.js初识<一> 一:环境说明 1.1 Linux系统CentOS 5.8 1.2 nodejs v0.10.15 1.3 nodejs源码下载地址 htt ...
- JS面向对象笔记二
菜单导航,<JS面向对象笔记一>, 参考书籍:阮一峰之<JavaScript标准参考教程> 一.构造函数和new命令 二.this关键字 三.构造函数和new命令 四.构造函 ...
- WebGL three.js学习笔记 使用粒子系统模拟时空隧道(虫洞)
WebGL three.js学习笔记 使用粒子系统模拟时空隧道 本例的运行结果如图: 时空隧道demo演示 Demo地址:https://nsytsqdtn.github.io/demo/sprite ...
- WebGL three.js学习笔记 法向量网格材质MeshNormalMaterial的介绍和创建360度全景天空盒的方法
WebGL学习----Three.js学习笔记(5) 点击查看demo演示 Demo地址:https://nsytsqdtn.github.io/demo/360/360 简单网格材质 MeshNor ...
随机推荐
- test [ ] 四类
test可理解的表达式类型分为四类: 表达式判断 字符串比较 数字比较 文件比较 test xxx 可以简写成 [ xxx ] 的形式,注意两端的空格. 1)判 ...
- C#异常处理性能测试
异常处理性能测试 using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq ...
- 通过pustil模块取pid及对应的pidname
通过pustil模块取pid及对应的pidname import psutil import json def getpid(): reslut = psutil.pids() return resl ...
- 【转】Linux下apache/httpd服务启动与停止
apache服务,或者说httpd服务,如何启动,如何开机启动. 转来转去,找不到原文.. 操作系统环境:红帽5,具体如下:# uname -a Linux machine1 2.6.18-164.e ...
- iOS - UIButton折行文字显示设置
首先在控制器中创建一个button - (void)viewDidLoad { [super viewDidLoad]; UIButton * button = [[UIButton alloc] i ...
- RDIFramework.NET-.NET快速信息化系统开发整合框架 【开发实例 EasyUI】之产品管理(MVC版)
RDIFramework.NET—.NET快速开发整合框架 [开发实例]之产品管理(MVC版) 接上篇:RDIFramework.NET (.NET快速信息化系统开发整合框架) [开发实例]之产品管理 ...
- axis2打包方式发布
参照http://gao-xianglong.iteye.com/blog/1744557这篇文章,注意的是打包services.xml的时候要将它的上级目录meta-inf一起打包,放到axis2\ ...
- 点餐系统Sprint2总结
Sprint1结束后休息了两天,就开始准备Sprint2.一开始就知道数据库的连接对我们来说都是大难题. 虽然使用sqlite3,与android连接起来比较容易,但还是不容忽视.为期10天,和Spr ...
- SLP alpha 阶段总结
这学期快结束了,SLP的alpha阶段也结束了.在alpha版中,我实现了SLP的基础练习模块和全局设置模块,其他几个模块由于能力有限.时间有限而没有实现. 其中基础练习模块目前只能支持4/4拍,有三 ...
- Mvc4中使用Spring.Net实现IOC和DI
一个Hello类,一个IHello接口 1.引用dll 2.修改Global文件 (SpringMvcApplication) 3.控制器添加属性 4.WebConfig配置 5.Spring.xml ...