js单例模式
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单例模式的更多相关文章
- 浅谈js单例模式
单例模式就是在系统中保存一个实例,就是一个全局变量,在团队开发中,为了实现一些相似的功能,比如不同页面之间的表单验证,可能需求是不一样的,但是呢命名可能一样,这时就会产生冲突,这时候单例模式就能很好的 ...
- JS单例模式在工作中的使用
为了尽可能的减少全局变量的污染,在写js的时候可以采用单例模式,形式如下: 比如有一个js叫demo.js,那么我们可以在js里这样写: var demo = {} 这样做的目的是将整个js当成一个对 ...
- js单例模式详解实例
这篇文章主要介绍了什么是单例单例模式.使用场景,提供了3个示例给大家参考 什么是单例? 单例要求一个类有且只有一个实例,提供一个全局的访问点.因此它要绕过常规的控制器,使其只能有一个实例,供使用者使用 ...
- JS 单例模式
<parctical common lisp>的作者曾说,如果你需要一种模式,那一定是哪里出了问题.他所说的问题是指因为语言的天生缺陷,不得不去寻求和总结一种通用的解决方案. 不管是弱类型 ...
- js 单例模式笔记
单例指一个类只有一个实例,这个类自行创建这个实例. 利用对象字面量直接生成一个单例: var singleton = { prop: 1, method: function(){ console.lo ...
- js 单例模式的实现方式----闭包和构造函数内部判断
闭包: var singleton = function( fn ){ var result; return function(){ return result || ( result = fn .a ...
- js原生设计模式——8单例模式之简约版属性样式方法库
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8&qu ...
- 收藏的js学习小例子
1.js模拟java里的Map function Map(){ var obj = {} ; this.put = function(key , value){ obj[key] = value ; ...
- JS学习笔记3_函数表达式
1.函数表达式与函数声明的区别 函数声明有“提升”(hoisting)的特性,而函数表达式没有.也就是说,函数声明会在加载代码时被预先加载到context中,而函数表达式只有在执行表达式语句时才会被加 ...
随机推荐
- web标准(复习)--2 列布局
今天我们开始学习一列布局,包含以下几种形式: 1.一列固定宽度 2.一列固定宽度居中 3.一列自适应宽度 4.一列自适应宽度居中 5.一列二至多块布局 前一节我们回顾了xhtml基础和css基础部分, ...
- 编写自己的javascript功能库之Ajax(仿jquery方式)
本人学习的是php,所以就用php跟js来演示代码了,主要是锻炼自己写js的能力,练练手而已. 下面这是我编写的操作ajax的代码功能,勉强让我称之为库吧.. js代码实例(tool.ajax.js) ...
- OOAD基本概念
学习目标: 1.理解与掌握面向对象的概念与方法. 2.使用UML. 3.完成面向对象的分析与设计工作. 4.了解OO的设计原则及一些典型的设计模式 什么是面向对象? 面向对象(Object-Orien ...
- 子类重载父类的方法“parent:方法名”
在PHP中不能定义重名的函数,也包括不能再同一个类中定义重名的方法,所以也就没有方法重载.单在子类中可以定义和父类重名的方法,因为父类的方法已经在子类中存在,这样在子类中就可以把从父类中继承过来的方法 ...
- WebApi上传图片 await关键字
await关键字对于方法执行的影响 将上一篇WebApi上传图片中代码修改(使用了await关键字)如下: [HttpPost] public async Task<string> Pos ...
- java事件响应方法汇总(容器类监听、监听器类、AbstractAction、反射)
Java图形用户界面中,处理事件时所必须的步骤是: 1.创建接受响应的组件(控件)2.实现相关事件监听接口3.注册事件源的动作监听器4.事件触发时的事件处理 相应的可以通过以下的集中方式来作出事件响应 ...
- 基于toyix的进程和轻权进程的学习
我们在平时的计算机课上学习过进程,知道程序的执行的背后其实就是进程在进行一些操作.大家都知道打开windows的任务管理器可以看到正在运行的进程,当程序卡死时,可以在任务管理器里强制关闭相关程序的进程 ...
- 智能卡安全机制比较系列(四) PayFlex
PayFlex是斯伦贝谢公司(经过若干整合现在是金雅拓的一部分)在上世纪90年代推出的一款电子钱包支付COS,从功能上看可以说PayFlex是EMV96以及PBOC电子钱包规范的雏形. PayFlex ...
- Delphi 函数指针(函数可以当参数)
首先学习: 指向非对象(一般的)函数/过程的函数指针 Pascal 中的过程类型与C语言中的函数指针相似,为了统一说法,以下称函数指针.函数指针的声明只需要参数列表:如果是函数,再加个返回值.例如声明 ...
- windows下重命名一个带有前缀"."dot字符的名字的错误问题
如果用正常的右键重命名那么肯定会报错的,比如: 有一个名为project的文件,我想把它命名为.project,加了个前缀dot.然后window就报错了,弹出个对话框让“你必须输入一个文件名”.它可 ...