js实现单例模式,经常使用两种方法,一种是使用构造函数的静态属性中缓存该实例,另一种是将实例包装在闭包中。

第一种实现方式:

//静态属性中单例模式
function Universe() {
if (typeof Universe.instance === "object") {
return Universe.instance;
}
//正常运行
this.start_time = 0;
this.bang = "Big"; //缓存
Universe.instance = this;
//隐式返回
//return this;
} var uni = new Universe();
var uni2 = new Universe();
console.log(uni === uni2 ); //true

第二种实现方式:

/闭包中实现单例模式
function Universe(){
//缓存实例
var instance = this;
//正常进行
this.start_time = 0;
this.bang = "Big";
//重写该构造函数
Universe = function(){
return instance;
}
//隐式返回
//return this;
}
var uni = new Universe();
var uni2 = new Universe();
console.log(uni == uni2); //true

上面实现单例模式有个缺点,就是重写构造函数,会丢失所有在初始化和重定义时刻之间添加到它里面的属性,如下

//test
Universe.prototype.nothing = true;
var uni = new Universe();
//在创建初始化对象之后,再次向该原型添加属性
Universe.prototype.something = true;
var uni2 = new Universe(); console.log(uni.nothing); //true
console.log(uni2.nothing); //true
console.log(uni2.something); //undefined
console.log(uni2.something); //undefined
console.log(uni.constructor.name); //Universe
console.log(uni.constructor === Universe); //false

其中uni.constructor仍然指向了原始的构造函数。

如果需要使原型和构造函数指针按照预期的那样运行,可以向下面一样改写代码

//如果需要使原型和构造函数指针能够按照预期那样运行,改写如下
function Universe() {
//缓存实例
var instance;
//重写构造函数
Universe = function Universe() {
return instance;
};
//保留原型属性
Universe.prototype = this;
//实例
instance = new Universe(); //重置构造函数指针
instance.constructor = Universe;
//功能实现
instance.start_time = 0;
instance.bang = "Big"; return instance;
}
//test
Universe.prototype.nothing = true;
var uni = new Universe();
//在创建初始化对象之后,再次向该原型添加属性
Universe.prototype.something = true;
var uni2 = new Universe(); console.log(uni.nothing); //true
console.log(uni2.nothing); //true
console.log(uni2.something); //true
console.log(uni2.something); //true
console.log(uni.constructor.name); //Universe
console.log(uni.constructor === Universe); //true

另一种解决方案是将构造函数和实例包装在即使函数中。

var Universe;
(function(){
var instance;
Universe = function Universe(){
if(instance){
return instance;
}
instance = this; //所有的功能
this.start_time = 0;
this.bang = "BIg";
}
}());

js单例模式的更多相关文章

  1. 浅谈js单例模式

    单例模式就是在系统中保存一个实例,就是一个全局变量,在团队开发中,为了实现一些相似的功能,比如不同页面之间的表单验证,可能需求是不一样的,但是呢命名可能一样,这时就会产生冲突,这时候单例模式就能很好的 ...

  2. JS单例模式在工作中的使用

    为了尽可能的减少全局变量的污染,在写js的时候可以采用单例模式,形式如下: 比如有一个js叫demo.js,那么我们可以在js里这样写: var demo = {} 这样做的目的是将整个js当成一个对 ...

  3. js单例模式详解实例

    这篇文章主要介绍了什么是单例单例模式.使用场景,提供了3个示例给大家参考 什么是单例? 单例要求一个类有且只有一个实例,提供一个全局的访问点.因此它要绕过常规的控制器,使其只能有一个实例,供使用者使用 ...

  4. JS 单例模式

    <parctical common lisp>的作者曾说,如果你需要一种模式,那一定是哪里出了问题.他所说的问题是指因为语言的天生缺陷,不得不去寻求和总结一种通用的解决方案. 不管是弱类型 ...

  5. js 单例模式笔记

    单例指一个类只有一个实例,这个类自行创建这个实例. 利用对象字面量直接生成一个单例: var singleton = { prop: 1, method: function(){ console.lo ...

  6. js 单例模式的实现方式----闭包和构造函数内部判断

    闭包: var singleton = function( fn ){ var result; return function(){ return result || ( result = fn .a ...

  7. js原生设计模式——8单例模式之简约版属性样式方法库

    <!DOCTYPE html><html lang="en"><head>    <meta charset="UTF-8&qu ...

  8. 收藏的js学习小例子

    1.js模拟java里的Map function Map(){ var obj = {} ; this.put = function(key , value){ obj[key] = value ; ...

  9. JS学习笔记3_函数表达式

    1.函数表达式与函数声明的区别 函数声明有“提升”(hoisting)的特性,而函数表达式没有.也就是说,函数声明会在加载代码时被预先加载到context中,而函数表达式只有在执行表达式语句时才会被加 ...

随机推荐

  1. Hadoop学习历程(五、真正的分布式系统搭建)

    之前都是单节点进行的操作与测试,现在进行真正的多节点系统搭建 1. 准备系统与配置 共准备4台机器搭建Hadoop集群.基于CentOS6.2,jdk1.6.0_31,Hadoop2.2.0版本 19 ...

  2. Python入门-----介绍

    摘要:Python语言的特点 ----->优雅.明确.简单 一.Python适合的领域 web网站和各种网络服务 系统工具和脚本 作为“胶水”语言,把其他语言开发的模块包装起来方便使用 二.Py ...

  3. Kafka笔记--常用指令(删除topic)

    删除topic 首先需要设置server.properties,最后一行添加 delete.topic.enable=true 然后运行> ./kafka-topics.sh --zookeep ...

  4. 一个图片上传的servlet,传到本地磁盘,要传到服务器请修改

    本来想写个controller,结果拦截器把图片拦住了,那就直接servlet public class UploadEamge extends HttpServlet{ /** * */ priva ...

  5. gcd - b- 201611302317

    谈到iOS多线程,一般都会谈到四种方式:pthread.NSThread.GCD和NSOperation.其中,苹果推荐也是我们最经常使用的无疑是GCD.对于身为开发者的我们来说,并发一直都很棘手,如 ...

  6. WCF-NAT模式访问

    由于项目需求,第一次用wcf做基于internet的访问.整理一下自己的探索,作为总结,也供自己以后回顾. 要求:(1)wcf服务需要部署在internet之中. (2)双工通信. 出现问题: 根据上 ...

  7. Android系统服务-简介

    http://blog.csdn.net/chenyafei617/article/details/6577907 Introduction 我们知道Android系统服务挺多的,做程序时经常会用到, ...

  8. 用keil直接生成BIN文件

    1.下载hex2bin到keil的任意目录,下载地址:http://www.keil.com/download/docs/7.asp 或者 http://www.hex2bin.com/files/h ...

  9. MySQL所有函数及操作符

    参考:Function and Operator Reference Name Description ABS() Return the absolute value ACOS() Return th ...

  10. iOS 9之Advanced Touch Input(高级触摸输入)

    金田 今天要讲的主题是iOS 9高级触摸输入,更准确地讲,是在iOS9上如何减少触摸输入到屏幕显示的延迟程度,此次将分 低延迟渲染(iOS9 渲染性能优化)和 触摸点方案改进 两个方面来介绍. 低延迟 ...