js设计模式--单体模式
2013-09-16 15:48 明朝 阅读(242) 评论(0) 编辑 收藏 举报
GOF里的23种设计模式, 也是在软件开发中早就存在并反复使用的模式. 如果程序员没有明确意识到他使用过某些模式, 那么下次他也许会错过更合适的设计 (这段话来自《松本行弘的程序世界》).
单体模式:
单体(Singleton)模式的思想在于保证一个特定类仅有一个实例。当在第二次使用同一个类创建新对象的时候,和第一次创建对象完全相同对象。
当使用new语法通过构造函数来创建对象,仅仅获得的是指向完全相同的对象的新指针:
例:
function uniFn(){}; var uni1 = new uniFn(); var uni2 = new uniFn(); uni1.constructor === uni2.constructor; //true 指向的是同一个构造函数
使用对象字面量创建一个单体:
var obj = { first:"单体",
two:function(){} };
js中是没有类的概念,只有对象。当创建一个新对象的时,实际上没有其他对象与其类似,新对象已经是单体了。
var obj1 = { first:"单体", two:function(){} }; var obj2 = { first:"单体", two:function(){} }; obj1 == obj2; //false 即便是创建完全相同成员的同类对象,他们也是不想等的。 obj1 === obj2; //false
通过闭包实现单体的方法,这个秘诀在与重写构造函数:
function example(){
//缓存实例 var instans = this; this.name = "_this";
//重写构造函数 example = function(){ return instans; }; }; var exa = new example(); var exa2 = new example(); console.log(exa == exa2); //true console.log(exa == exa2);//true
如果需要使原型和构造函数指针按照预期的那样运行,可以通过调整实现这个目标:
function example(){ //缓存实例 var instans; //重写构造函数 example = function(){ return instans; }; //保留原型属性 example.prototype = this; //实例 instans = new example(); //重置构造函数指针 instans.constructor = example; //功能 this.name = "_this"; return instans; }; example.prototype.nothing = true; var exa = new example(); example.prototype.evething = true; var exa2 = new example(); console.log(exa === exa2); //true //所有属性都起作用 console.log(exa.nothing && exa2.evething && exa.nothing && exa2.evething); //true //构造函数的指针 console.log(exa.constructor === example) //true
理解的并不够深刻,总结一遍,加强不少印象。
参考《javascript模式》
腾讯web前端团队:http://www.alloyteam.com/2012/10/common-javascript-design-patterns/