单例模式
把判断单例的逻辑封装在 getSingle函数内部,创建对象的方法 fn 被当成参数动态传入 getSingle 函数:(想要获得特定的元素只需要传入对应的fn就可以了,而无需改变getSinglel函数)
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';
};
这种单例模式的用途远不止创建对象,比如我们通常渲染完页面中的一个列表之后,接下来要给这个列表绑定 click 事件,如果是通过 ajax 动态往列表里追加数据,在使用事件代理的前提下, click 事件实际上只需要在第一次渲染列表的时候被绑定一次,
var bindEvent = getSingle(function() {
document.getElementById("div1").onclick = function() {
alert("click");
};
return true;
});
var render = function() {
console.log("开始渲染列表");
bindEvent();
};
render();
render();
render();