插件窝 干货文章 JavaScript-单例模式

JavaScript-单例模式

js 单例模式 669    来源:插件窝    2019-10-14

单例模式是设计模式中最为简单的一种,由名称可以初步感受到它的作用。

此模式会确保一个类只有一个实例,并提供一个它的全局访问点。

下面通过一个简单的代码实例来介绍一下它,代码如下:


<!doctype html>
<html>
<head>
<meta name="author" content="http://www.chajianwo.com/" />
<meta charset="UTF-8" />
<title>js单例模式</title>
<style type="text/css">
div{color:red}
</style>
</head>
<body>
<button id="bt">查看演示</button>
<script type="text/javascript">
var createDiv = (function () {
 var div;
 return function () {
  if (!div) {
   div = document.createElement('div');
   div.innerHTML = '插件窝';
   div.style.display = 'none';
   document.body.appendChild(div);
  }
  return div;
 }
})();
 
document.getElementById('bt').onclick = function () {
 var odiv = createDiv();
 odiv.style.display = 'block'
};
</script>
</body>
 
</html>

无论点击多少次按钮,都会只生成一个div元素,代码还不够好,下面进行一下改造:

<!doctype html>
<html>
<head>
<meta name="author" content="http://www.chajianwo.com/" />
<meta charset="UTF-8" />
<title>js单例模式</title>
<style type="text/css">
div{color:red}
</style>
</head>
<body>
<button id="bt">登录</button>
<script type="text/javascript">
var getSingle = function(fn) {
  var result;
  return function() {
    return result || (result = fn.apply(this, arguments));
  }
}
         
//生成单例函数
var createDiv = getSingle(function() {
  var div = document.createElement('div');
  div.innerHTML = '我是登录弹出窗';
  div.style.display = 'none';
  document.body.appendChild(div);
  return div;
})
         
document.getElementById('bt').onclick = function() {
  var odiv = createLoginLayer();
  odiv.style.display = 'block';
}
</script>
</body>
</html>

将上管理单例的逻辑从原来的代码中抽离出来,封装在getSingle函数内部:


var getSingle=  function(fn) {
    var result;
    return function() {
      return result || (result = fn.apply(this, arguments));
    }
}

创建实例对象职责和管理单例职责分别放置在两个方法里,这两个方法可以独立变化互不影响。