单例模式是指,一个类仅有一个实例,并提供一个访问它的全局访问点。
上一种写法的问题是,对象能被任意修改,对象存在被破坏的风险。保护对象我们当然想起的就是使用闭包
var Singleton = function (name) { this.name = name; }; Singleton.prototype.getName= function(){ console.log(this.name); }; Singleton.getInstance = (function () { var instance = null; return function (name) { if(!instance){ instance = new Singleton(name); } return instance; } })(); var a = Singleton.getInstance('a'); var b = Singleton.getInstance('b'); console.log(a === b);实际上以上单例模式是行的通的,但是实际上javascript天然支持单例,在构造函数中直接返回对象精可以创建单例。
var User = (function () { var __name = 'xin',__age = 29; return { getInfo: function () { return __name + '-' + __age; }, setName: function (name) { return __name = name; } }; })(); console.log(User.getInfo()); User.setName('bing'); console.log(User.getInfo());通用的惰性单例,使职责单一
<body> <button id="loginBtn">登录</button> </body> <script> /*该单例是通用的并可以复用*/ var getSingle = function (fn) { var result; return function () { return result || (result = fn.apply(this, arguments)); } }; //被传递使用的函数 var createLoginLayer = function () { var div = document.createElement('div'); div.innerHTML = "只是悬浮窗口"; div.style.display = 'none'; document.body.appendChild(div); return div; }; var createSingleLoginLayer = getSingle(createLoginLayer); document.getElementById('loginBtn').onclick = function () { var loginLayer = createSingleLoginLayer(); loginLayer.style.display = 'block'; } </script>