这里有新鲜出炉的 Javascript 教程,程序狗速度看过来!
Javascript 是一种由 Netscape 的 LiveScript 发展而来的原型化继承的基于对象的动态类型的区分大小写的客户端脚本语言,主要目的是为了解决服务器端语言,比如 Perl,遗留的速度问题,为客户提供更流畅的浏览效果。
这篇文章主要为大家详细介绍了 JavaScript 单例模式,帮助大家轻松掌握 JS 单例模式,感兴趣的小伙伴们可以参考一下
定义:保证一个对象(类)仅有一个实例,并提供一个访问它的全局访问点; 实现原理:利用闭包来保持对一个局部变量的引用,这个变量保存着首次创建的唯一的实例; 主要用于:全局缓存、登录浮窗等只需要唯一一个实例的时候;
一. 为一个非单例模式对象(如:Demo)实现单例模式的方法: 给 Demo 添加一个静态方法来实现单例:
- Demo.getSingle = (function() {
- var demo = null;
- return function(name) {
- if (!demo) {
- demo = new Demo(name);
- }
- return demo;
- }
- })();
用法: 非单例模式:var a = new Demo('Peter'); 单例模式:
- var b1 = Demo.getSingle('Peter');
- var b2 = Demo.getSingle('Sufei');
- b1 === b2; //true,都引用的是new Demo('Peter')
通过代理类来实现单例:
- var ProxyDemo = (function() {
- var demo = null;
- return function(name) {
- if (!demo) {
- demo = new Demo(name);
- }
- return demo;
- }
- })();
用法: 非单例模式:var a = new Demo('Peter'); 单例模式:var b = new ProxyDemo('Peter');
二. 惰性单例模式:只在需要的时候才创建该单例; 以下是通用惰性单例的创建方法:
- var getSingle = function(foo) {
- var single = null;
- return function() {
- return single || (single = foo.apply(this, arguments));
- }
- };
用法:
- var createLoginLayer = function() {
- var frag = document.createDocumentFragment();
- var div = document.createElement('div');
- div.style.display = 'none';
- //以下给div添加其它登录元素
- ...document.body.appendChild(frag.appendChild(div));
- return div;
- }
- var createSingleLoginLayer = getSingle(createLoginLayer);
- //当用户第一次点击按钮(id = 'lgBtn')时,来创建并显示登录窗口,之后重复点击按钮不会重复创建;
- document.getElementById('lgBtn').onclick = function() {
- var lg = createSingleLoginLayer();
- lg.style.display = 'block';
- }
附:缓存函数的计算结果,如计算一个数的数列 以下是不缓存的写法,非常慢!
- function foo(n) {
- results = n < 2 ? n: foo(n - 1) + foo(n - 2);
- return results;
- }
- console.log(foo(40)); //得计算好几秒
以下是缓存写法,基本瞬间出结果!
- var cache = {};
- function foo(n) {
- if (!cache[n]) {
- cache[n] = n < 2 ? n: foo(n - 1) + foo(n - 2);
- }
- return cache[n];
- }
- console.log(foo(100));
更好的写法:
- var foo = (function() {
- var cache = {};
- return function(n) {
- if (!cache[n]) {
- cache[n] = n < 2 ? n: foo(n - 1) + foo(n - 2);
- }
- return cache[n];
- };
- })();
- console.log(foo(100));
参考文献: 《JavaScript 模式》 《JavaScript 设计模式与开发实践》
来源: http://www.phperz.com/article/17/0513/332320.html