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. MediaWiki基本设置

    1.左侧导航栏设置 在右上角搜索栏中输入“mediawiki:sidebar” 确认后进行编辑(需要以站长或管理员身份登录). 格式: *导航栏名称一 **链接一地址|链接一名称 **链接二地址|链接 ...

  2. php 二维数组按照某value值求出最大值最小值

    //商家的等级信息是一个二维数组,求出最小折扣和最大折扣array(0=>array('levelname'=>'银','dis'=>7.5), 1=>array('level ...

  3. PHP数据过滤

    1.php提交数据过滤的基本原则  1)提交变量进数据库时,我们必须使用addslashes()进行过滤,像我们的注入问题,一个addslashes()也就搞定了.其实在涉及到变量取值时,intval ...

  4. pyqt5通过文本对话框打开文件

    点击按钮,打开文本对话框,找一人文件,打开并显示内容 QFIleDialog                                                              ...

  5. AngularJS自定义表单验证

    <!doctype html> <html ng-app="myApp"> <head> <script src="G:\\So ...

  6. java事件响应方法汇总(容器类监听、监听器类、AbstractAction、反射)

    Java图形用户界面中,处理事件时所必须的步骤是: 1.创建接受响应的组件(控件)2.实现相关事件监听接口3.注册事件源的动作监听器4.事件触发时的事件处理 相应的可以通过以下的集中方式来作出事件响应 ...

  7. 关闭WIN10的UAC/自动更新/杀毒软件(兼容WIN7/8/8.1)

    第一部分:禁用wuauserv服务以及关闭UAC(保存为DW10UD.REG) Windows Registry Editor Version 5.00 [HKEY_LOCAL_MACHINE\SYS ...

  8. 关于iostream的效率问题

    前言    经常有人说iostream的速度慢,IO流比stdio的慢多了.但是有人测试过的,iostream的速度是超过stdio的. 测试结果 /* C */#include <stdio. ...

  9. JVM基础和调优(一)

    最近的项目中,出现了内存和性能的问题,需要优化,所以趁着这个机会,把自己关于java虚拟机的东整理一下,不对的地方,欢迎指出. 数据类型,因为在java的优化的过程中,检测到的数据类型一般比较的基础, ...

  10. jQuery中ajax的使用和缓存问题解决 $getjson 与$get都会被IE缓存

    原文地址:http://www.cnblogs.com/fullhouse/archive/2012/01/17/2324842.html 1:GET访问 浏览器 认为 是等幂的就是 一个相同的URL ...