千锋教育-做有情怀、有良心、有品质的职业教育机构

领取全套视频

关注千锋学习站小程序
随时随地免费学习课程

当前位置:首页  >  技术要点  >  正文
分享到:

什么叫懒人封装?

时间:2023-03-03 10:28     来源:千锋大连校区 作者:bjq

  什么叫懒人封装?懒人封装(懒惰模式)

  ● 本文旨在一些特殊的封装上

  ● 一般会用于处理浏览器兼容性的封装

  ● 但是看完会对你有一些启发也说不定哦 O(∩_∩)O~

 

懒人封装

    一段简单的代码

  ● 我们在封装 ajax 请求的时候

  ● 基于原生 js 的 ajax 代码, 如果考虑到浏览器兼容问题

  ● 那么我们一定会看到以下几段代码

  // 标准浏览器下创建 ajax 对象

  new XMLHttpRequest();

  // 以下三种都是IE浏览器,对应不同版本

  new ActiveXObject('Msxml12.XMLHTTP');

  new ActiveXObject('Msxml13.XMLHTTP');

  new ActiveXObject('Microsoft.XMLHTTP');

  开始第一次封装

  ● 想到就做, 我们就来进行一次封装试试看

  function xhl_ajax(options) {

  // ...

  let xml = null

  if (window.XMLHttpRequest) {

  xml = new XMLHttpRequest()

  } else if (new ActiveXObject) {

  xml = new new ActiveXObject('Microsoft.XMLHTTP')

  } else {

  xhl = '你的浏览器可能不支持 ajax 请求, 请更换浏览器再试'

  }

  // ...

  }

  ● 我这里并没有写完整, 只是简单一个小示例

  ● 我们来分析一下这个事情

  ○ 我们的判断种类可能有很多种, 比如 A B C D 四种

  // 那么这一段代码就变成了

  function xhl_ajax() {

  // ...

  if (A) {

  // ...

  } else if (B) {

  // ...

  } else if (C) {

  // ...

  } else if (D) {

  // ...

  } else {

  // ...

  }

  // ...

  }

  ● 代码可能就变成了这个样子

  ● 可能有的小伙伴会想到, 我改成 策略模式 封装不就好了

  我要说的不是这个问题

  ○ 不管你改成什么模式封装, 哪怕是起飞模式

  ○ 如果你当前需要匹配到的内容是 D

  ○ 那么每调用一次, 都会从 A 开始判断一次

  ○ 然后到达 D

  // 第一次调用

  xhl_ajax() // 需要判断 A 不对, B 不对, C 不对, D 对了

  // 第二次调用

  xhl_ajax() // 需要判断 A 不对, B 不对, C 不对, D 对了

  // ...

  ● 想象一下, 如果调用了 100 次, 那么每次的前三个判断是不是都浪费了呢

  ● 好像是这样的

  ○ 那我们是不是可以考虑换一个方式来搞一下

  懒惰模式封装这段代码

  ● 我们能不能考虑一下, 我封装完毕的代码, 只有第一次调用的时候会判断

  ● 后面调用的时候不在判断了, 那么是不是会节省很多呢 ?

  ● 想到就做

  ○ 原则就是多个事情依次完成

  ○ 前一个成功了, 后面的不做了

  ○ 只要成功过一次, 以后就不在尝试了

  1. 把我们需要做的几个事情放在几个函数内

  function createXHR1 () {

  return new XMLHttpRequest;

  }

  function createXHR2 () {

  return new XActiveXObject("Microsoft.XMLHTTP");

  }

  function createXHR3 () {

  return new ActiveXObject("Msxml2.XMLHTTP");

  }

  function createXHR4 () {

  return new ActiveXObject("Msxml3.XMLHTTP");

  }

  ● 这样一来, 如果第一个能成功, 那么我们调用第一个函数就回得到对应的 ajax 对象了

  ● 如果第一个不行, 我们就尝试第二个

  2. 接下来我们把四个函数放在一个数组内, 遍历依次执行

  ● 只要找到一个合适的就行了

  var xmls = [createXHR1, createXHR2, createXHR3, createXHR4]

  let xml = null

  for (var i = 0; i < xmls.length; i++) {

  // 一旦 xml 有内容了, 不再是 null 了, 那么直接结束循环

  if (xml) break

  // 否则就开始尝试

  xml = xmls[i]()

  }

  ● 问题随之而来了, 如果第一个不对, 那么会报错

  ● 我的代码就全部挂掉了

  3. 尝试使用 try catch 解决问题

  ● 为了不让我的代码挂掉

  ● 我们改用 try catch 来解决问题

  var xmls = [createXHR1, createXHR2, createXHR3, createXHR4]

  let xml = null

  for (let i = 0; i < xmls.length; i++) {

  try {

  xml = xmls[i]()

  } catch(e) {}

  }

  ● 错了也不需要做什么 , 直接下一次就好了

  ● 看上去挺好, 但是问题依旧没有解决

  4. 单独制作一个函数

  ● 我的原则就是, 让这个函数第一次调用和第二次调用不是一个函数就好了

  ● 也就是我要在第一次调用完毕以后修改这个函数

  function createXHR() {

  // 定义一个 xhr 接收 ajax 对象

  // 定义一个 flag 开关,看看是否找到合适的创建 ajax 对象的方法

  // 定义一个数组,存储四种创建 ajax 对象的方式

  let xml = null,

  flag = false,

  xmls = [

  function () {

  return new XMLHttpRequest;

  },

  function () {

  return new ActiveXObject("Microsoft.XMLHTTP");

  },

  function () {

  return new ActiveXObject("Msxml2.XMLHTTP");

  },

  function () {

  return new ActiveXObject("Msxml3.XMLHTTP");

  }

  ];

  // 依旧是循环遍历数组

  for (let i = 0, len = xmls.length; i < len; i++) {

  let curFn = ary[i];

  // 依次执行,找到合适的创建 ajax 对象的方法

  try {

  xml = curFn();

  // 这里是核心,一旦找到合适的方法,那么我们就把这个函数重新赋值给 createXHR

  createXHR = curFn;

  // 让开关为 true

  flag = true;

  break;

  } catch (e) {

  }

  }

  // 如果到最后开关依旧为 false,证明四种方法都不合适,那么我们就需要提醒浏览器升级

  if (!flag) {

  throw new Error("your browser is not support ajax, please change your browser,try again!");

  }

  // 最后返回 ajax 对象

  return xml;

  }

  ● 看似没有什么改变,但是之一第 28 行的代码,有一个重写 createXHR

  ● 这个是整个”惰性思想”的核心,也就是说,我只有在当前浏览器中,第一次执行 createXHR 的时候是这个函数

  ● 一旦找到一个合适的创建 ajax 对象的方法以后,那么从第二次执行 createXHR 开始,就全部都是我们之前数组中的某一个函数了

  ● 再也不用循环判断,而是直接用一种有效的方法创建一个 ajax 对象了

  ● 这个是一种 js 中的高级编程思想,如果理解不了,就用我们最开始写的判断的形式来进行就可以,慢慢体会一段时间就能明白了

  完整代码

  function createXHR() {

  let xml = null,

  flag = false,

  xmls = [

  function () {

  return new XMLHttpRequest;

  },

  function () {

  return new ActiveXObject("Microsoft.XMLHTTP");

  },

  function () {

  return new ActiveXObject("Msxml2.XMLHTTP");

  },

  function () {

  return new ActiveXObject("Msxml3.XMLHTTP");

  }

  ];

  for (let i = 0, len = xmls.length; i < len; i++) {

  let curFn = ary[i];

  try {

  xml = curFn();

  createXHR = curFn;

  flag = true;

  break;

  } catch (e) {

  }

  }

  if (!flag) {

  throw new Error("your browser is not support ajax, please change your browser,try again!");

  }

  return xml;

  }

  function xhl_ajax(options) {

  // ...

  const xml = createXHR()

  // ...

  }

  ● 从此以后, 你就去随便调用吧

  ● 只有第一次的时候会进行判断, 后面的时候都不会进行判断了

  ● 直接就能使用那个最准确的了

相关文章

  • 北京总部地址:北京市海淀区宝盛北里西区28号中关村智诚科创大厦4层
    北京沙河校区:北京市昌平区沙阳路18号北京科技职业技术学院广场服务楼
    咨询电话:400-811-9990
    面授课程:HTML5大前端培训、JavaEE+分布式开发培训、Python全栈+人工智能培训、全链路UI/UE设计培训、云计算培训、全栈软件测试培训、大数据+人工智能培训、智能物联网+嵌入式培训、Unity游戏开发培训、Go语言开发培训、PHP全栈+服务器集群培训、网络安全培训、网络营销培训、好程序员
    认证课程:软考、、PMP认证、红帽RHCE认证
  • 深圳校区地址:深圳市宝安区宝安大道5010号西部硅谷B座C区1层108
    咨询电话:400-811-9990
    面授课程:HTML5大前端培训、JavaEE+分布式开发培训、Python全栈+人工智能培训、全链路UI/UE设计培训、云计算培训、全栈软件测试培训、大数据+人工智能培训、智能物联网+嵌入式培训、Unity游戏开发培训、Go语言开发培训、PHP全栈+服务器集群培训、网络安全培训、网络营销培训、好程序员
    认证课程:软考、、PMP认证、红帽RHCE认证
  • 上海校区地址:上海市宝山区同济支路199号智慧七立方3号楼2-4层
    咨询电话:400-811-9990
    面授课程:HTML5大前端培训、JavaEE+分布式开发培训、Python全栈+人工智能培训、全链路UI/UE设计培训、云计算培训、全栈软件测试培训、大数据+人工智能培训、智能物联网+嵌入式培训、Unity游戏开发培训、Go语言开发培训、PHP全栈+服务器集群培训、网络安全培训、网络营销培训、好程序员
    认证课程:软考、、PMP认证、红帽RHCE认证
  • 广州校区地址:广州市白云区永平街永泰学山塘学山文化创意谷A1栋六楼
    咨询电话:400-811-9990
    面授课程:HTML5大前端培训、JavaEE+分布式开发培训、Python全栈+人工智能培训、全链路UI/UE设计培训、云计算培训、全栈软件测试培训、大数据+人工智能培训、智能物联网+嵌入式培训、Unity游戏开发培训、Go语言开发培训、PHP全栈+服务器集群培训、网络安全培训、网络营销培训、好程序员
    认证课程:软考、、PMP认证、红帽RHCE认证
  • 郑州二七区校区地址:郑州市二七区航海中路60号海为科技园C区10层
    郑州高新区校区地址:郑州市高新区金梭路与银杏路交叉口教育科技产业园南门D座4层
    咨询电话:400-811-9990
    面授课程:HTML5大前端培训、JavaEE+分布式开发培训、Python全栈+人工智能培训、全链路UI/UE设计培训、云计算培训、全栈软件测试培训、大数据+人工智能培训、智能物联网+嵌入式培训、Unity游戏开发培训、Go语言开发培训、PHP全栈+服务器集群培训、网络安全培训、网络营销培训、好程序员
    认证课程:软考、、PMP认证、红帽RHCE认证
  • 大连校区地址:辽宁省大连市高新园区爱贤街10号大连设计城A座901
    咨询电话:400-811-9990
    面授课程:HTML5大前端培训、JavaEE+分布式开发培训、Python全栈+人工智能培训、全链路UI/UE设计培训、云计算培训、全栈软件测试培训、大数据+人工智能培训、智能物联网+嵌入式培训、Unity游戏开发培训、Go语言开发培训、PHP全栈+服务器集群培训、网络安全培训、网络营销培训、好程序员
    认证课程:软考、、PMP认证、红帽RHCE认证
  • 武汉金融港校区地址:武汉市东新区光谷大道77号金融港B18栋三、四层
    咨询电话:400-811-9990
    面授课程:HTML5大前端培训、JavaEE+分布式开发培训、Python全栈+人工智能培训、全链路UI/UE设计培训、云计算培训、全栈软件测试培训、大数据+人工智能培训、智能物联网+嵌入式培训、Unity游戏开发培训、Go语言开发培训、PHP全栈+服务器集群培训、网络安全培训、网络营销培训、好程序员
    认证课程:软考、、PMP认证、红帽RHCE认证
  • 成都校区地址:成都市高新区肖家河沿街138号肖家河大厦三楼
    咨询电话:400-811-9990
    面授课程:HTML5大前端培训、JavaEE+分布式开发培训、Python全栈+人工智能培训、全链路UI/UE设计培训、云计算培训、全栈软件测试培训、大数据+人工智能培训、智能物联网+嵌入式培训、Unity游戏开发培训、Go语言开发培训、PHP全栈+服务器集群培训、网络安全培训、网络营销培训、好程序员
    认证课程:软考、、PMP认证、红帽RHCE认证
  • 西安校区地址:西安市雁塔区高新六路52号立人科技C座西区4楼
    咨询电话:400-811-9990
    面授课程:HTML5大前端培训、JavaEE+分布式开发培训、Python全栈+人工智能培训、全链路UI/UE设计培训、云计算培训、全栈软件测试培训、大数据+人工智能培训、智能物联网+嵌入式培训、Unity游戏开发培训、Go语言开发培训、PHP全栈+服务器集群培训、网络安全培训、网络营销培训、好程序员
    认证课程:软考、、PMP认证、红帽RHCE认证
  • 杭州旺田校区:浙江省杭州市上城区九堡镇旺田书画城A座4层
    咨询电话:400-811-9990
    面授课程:HTML5大前端培训、JavaEE+分布式开发培训、Python全栈+人工智能培训、全链路UI/UE设计培训、云计算培训、全栈软件测试培训、大数据+人工智能培训、智能物联网+嵌入式培训、Unity游戏开发培训、Go语言开发培训、PHP全栈+服务器集群培训、网络安全培训、网络营销培训、好程序员
    认证课程:软考、、PMP认证、红帽RHCE认证
  • 青岛校区地址:青岛市市北区龙城路31号卓越世纪中心4号楼5层
    咨询电话:400-811-9990
    面授课程:HTML5大前端培训、JavaEE+分布式开发培训、Python全栈+人工智能培训、全链路UI/UE设计培训、云计算培训、全栈软件测试培训、大数据+人工智能培训、智能物联网+嵌入式培训、Unity游戏开发培训、Go语言开发培训、PHP全栈+服务器集群培训、网络安全培训、网络营销培训、好程序员
    认证课程:软考、、PMP认证、红帽RHCE认证
  • 重庆校区地址:重庆市九龙坡区科园一路3号渝高大厦9楼
    咨询电话:400-811-9990
    面授课程:HTML5大前端培训、JavaEE+分布式开发培训、Python全栈+人工智能培训、全链路UI/UE设计培训、云计算培训、全栈软件测试培训、大数据+人工智能培训、智能物联网+嵌入式培训、Unity游戏开发培训、Go语言开发培训、PHP全栈+服务器集群培训、网络安全培训、网络营销培训、好程序员
    认证课程:软考、、PMP认证、红帽RHCE认证
  • 长沙校区地址:湖南省长沙市岳麓区麓谷企业广场A2栋三单元306号
    咨询电话:400-811-9990
    面授课程:HTML5大前端培训、JavaEE+分布式开发培训、Python全栈+人工智能培训、全链路UI/UE设计培训、云计算培训、全栈软件测试培训、大数据+人工智能培训、智能物联网+嵌入式培训、Unity游戏开发培训、Go语言开发培训、PHP全栈+服务器集群培训、网络安全培训、网络营销培训、好程序员
    认证课程:软考、、PMP认证、红帽RHCE认证
  • 哈尔滨校区地址:哈尔滨市松北区世泽路689号 科技创新城4号楼405
    咨询电话:400-811-9990
    面授课程:HTML5大前端培训、JavaEE+分布式开发培训、Python全栈+人工智能培训、全链路UI/UE设计培训、云计算培训、全栈软件测试培训、大数据+人工智能培训、智能物联网+嵌入式培训、Unity游戏开发培训、Go语言开发培训、PHP全栈+服务器集群培训、网络安全培训、网络营销培训、好程序员
    认证课程:软考、、PMP认证、红帽RHCE认证
  • 南京校区地址:南京市建邺区应天大街780号弘辉产业园1栋2层
    咨询电话:400-811-9990
    面授课程:HTML5大前端培训、JavaEE+分布式开发培训、Python全栈+人工智能培训、全链路UI/UE设计培训、云计算培训、全栈软件测试培训、大数据+人工智能培训、智能物联网+嵌入式培训、Unity游戏开发培训、Go语言开发培训、PHP全栈+服务器集群培训、网络安全培训、网络营销培训、好程序员
    认证课程:软考、、PMP认证、红帽RHCE认证
  • 太原校区地址:太原市小店区长治路230号能源互联网大厦6层
    咨询电话:400-811-9990
    面授课程:HTML5大前端培训、JavaEE+分布式开发培训、Python全栈+人工智能培训、全链路UI/UE设计培训、云计算培训、全栈软件测试培训、大数据+人工智能培训、智能物联网+嵌入式培训、Unity游戏开发培训、Go语言开发培训、PHP全栈+服务器集群培训、网络安全培训、网络营销培训、好程序员
    认证课程:软考、、PMP认证、红帽RHCE认证
  • 沈阳校区地址:辽宁省沈阳市浑南区世纪路16号东大软件园B园B1座A201
    咨询电话:400-811-9990
    面授课程:HTML5大前端培训、JavaEE+分布式开发培训、Python全栈+人工智能培训、全链路UI/UE设计培训、云计算培训、全栈软件测试培训、大数据+人工智能培训、智能物联网+嵌入式培训、Unity游戏开发培训、Go语言开发培训、PHP全栈+服务器集群培训、网络安全培训、网络营销培训、好程序员
    认证课程:软考、、PMP认证、红帽RHCE认证
  • 合肥校区地址:合肥市包河区徽州大道396号东方广场B座12A
    咨询电话:400-811-9990
    面授课程:HTML5大前端培训、JavaEE+分布式开发培训、Python全栈+人工智能培训、全链路UI/UE设计培训、云计算培训、全栈软件测试培训、大数据+人工智能培训、智能物联网+嵌入式培训、Unity游戏开发培训、Go语言开发培训、PHP全栈+服务器集群培训、网络安全培训、网络营销培训、好程序员
    认证课程:软考、、PMP认证、红帽RHCE认证
  • 贵阳校区地址:贵阳市云岩区延安东路37号物资大厦老楼9楼
    咨询电话:400-811-9990
    面授课程:HTML5大前端培训、JavaEE+分布式开发培训、Python全栈+人工智能培训、全链路UI/UE设计培训、云计算培训、全栈软件测试培训、大数据+人工智能培训、智能物联网+嵌入式培训、Unity游戏开发培训、Go语言开发培训、PHP全栈+服务器集群培训、网络安全培训、网络营销培训、好程序员
    认证课程:软考、、PMP认证、红帽RHCE认证
  • 济南校区地址:济南市历下区历山路36号齐鲁师范学院利宝产业大厦3F
    咨询电话:400-811-9990
    面授课程:HTML5大前端培训、JavaEE+分布式开发培训、Python人工智能+数据分析培训、全链路UI/UE设计培训、云计算培训、全栈软件测试培训、大数据+人工智能培训、智能物联网+嵌入式培训、Unity游戏开发培训、网络安全培训、区块链培训、影视剪辑包装培训、游戏原画培训、全媒体运营培训
    认证课程:软考、、PMP认证、红帽RHCE认证
  • 千锋教育服务号

    了解千锋动态
    关注千锋教育服务号

  • 千锋教育移动站

    扫一扫快速进入
    千锋移动端页面

  • 千锋互联服务号

    扫码匿名提建议
    直达CEO信箱