web开发Web前端之路让前端飞

单体模式

2017-06-01  本文已影响28人  你期待的花开

单体模式:

单体模式用于创建命名空间,将一批关联的属性和方法组织成一个逻辑单元,减少全局变量。
逻辑单元中的代码通过单一的变量进行访问。

特点:

弊端:

耦合度高,不容易进行单元测试。

适合场合:

提供命名空间,增加代码模块性,分支功能。

应用

关于JavaScript的最头疼的事情之一是,它的变量没有特定的作用范围。 一般情况下,任何变量,函数,数组或对象都是全局性,这意味着在同一页上的其他脚本可以访问并覆盖它们。解决方法是把变量封装在一个匿名函数中。 例如,下面的定义将产生三个全局变量和和两个全局函数:

var name = 'Chris';
var age = '34';
var status = 'single';
function createMember(){
  // [...]
}
function getMemberDetails(){
  // [...]
} 

封装后如下:

var myApplication = function(){
var name = 'Chris';
var age = '34';
var status = 'single';
return{
  createMember:function(){
    // [...]
  },
  getMemberDetails:function(){
    // [...]
  }
}
}();

这被称为单体模式,是JavaScript设计模式的一种,改进的写法是:

  var myApplication = function(){
  var name = 'Chris';
  var age = '34';
  var status = 'single';
  function createMember(){
    // [...]
  }
  function getMemberDetails(){
    // [...]
  }
  return{
    create:createMember,
    get:getMemberDetails
  }
}();

利用分支技术来来封装浏览器之间的差异

注意的地方:
  1. 一定要用闭包,实现即时绑定;
  2. 每个分支之间用分号隔开;
  3. 最后返回的是分支的名字;
  4. 调用的时候用单体名+分支的方法名。
    // 利用单体的分支技术来定义XHR(XMLHttpRequest)对象,必须要用闭包才可以实现
    var XHR = (function () {
        var standard = {
            cXHR: function () {
                return new XMLHttpRequest();
            }
        };
        var activeXNew = {
            cXHR: function () {
                return new ActiveXObject('Msxml2.XMLHttp');
            }
        };
        var activeXOld = {
            cXHR: function () {
                return new ActiveXObject('Microsoft.XMLHttp');
            }
        };
        var testObject;
        try {
            testObject = standard.cXHR();
            return standard;
        } catch (e) {
            try {
                testObject = activeXNew.cXHR();
                return activeXNew;
            } catch (e) {
                try {
                    testObject = activeXOld.cXHR();
                    return activeXOld;
                } catch (e) {
                    throw new Error('Create the XMLHttpRequestObject failed!');
                }
            }
        }
    })();
    window.onload = function () {
        alert(XHR.cXHR());
    }
上一篇 下一篇

猜你喜欢

热点阅读