JavaScript设计模式--简单工厂模式实例分析【XHR工厂案例】


Posted in Javascript onMay 23, 2020

本文实例讲述了JavaScript设计模式--简单工厂模式。分享给大家供大家参考,具体如下:

第一步,Ajax操作接口(目的是起一个接口检测作用)

(1)引入接口文件

//定义一个静态方法来实现接口与实现类的直接检验
//静态方法不要写出Interface.prototype ,因为这是写到接口的原型链上的
//我们要把静态的函数直接写到类层次上
//(1)定义一个接口类
var Interface=function (name,methods) {//name:接口名字
 if(arguments.length<2){
  alert("必须是两个参数")
 }
 this.name=name;
 this.methods=[];//定义一个空数组装载函数名
 for(var i=0;i<methods.length;i++){
  if(typeof methods[i]!="string"){
   alert("函数名必须是字符串类型");
  }else {
   this.methods.push( methods[i]);
  }
 }
};
Interface.ensureImplement=function (object) {
 if(arguments.length<2){
  throw new Error("参数必须不少于2个")
  return false;
 }
 for(var i=1;i<arguments.length;i++){
  var inter=arguments[i];
  //如果是接口就必须是Interface类型
  if(inter.constructor!=Interface){
   throw new Error("如果是接口类的话,就必须是Interface类型");
  }
  //判断接口中的方法是否全部实现
  //遍历函数集合
  for(var j=0;j<inter.methods.length;j++){
   var method=inter.methods[j];//接口中所有函数

   //object[method]传入的函数
   //最终是判断传入的函数是否与接口中所用函数匹配
   if(!object[method]||typeof object[method]!="function" ){//实现类中必须有方法名字与接口中所用方法名相同
    throw new Error("实现类中没有完全实现接口中的所有方法")
   }
  }
 }
}

第二步,实例化一个可以具体的ajax接口

var AjaxHandler=new Interface("AjaxHandler",["request","createXhrObject"]);

第三步,针对接口的ajax实现类

(1)定义一个空类

var SimpleHandler=function(){};

(2)在该空类上直接扩展原型---实现接口里面的方法

SimpleHandler.prototype={
  /*
  * method:get post
  * url:请求地址
  * callback:回调函数
  * postVars:传入参数
  * */
  request:function (method,url,callback,postVars) {
     //1,使用工厂得到xhr对象
   var xhr=this.createXhrObject();

   xhr.onreadystatechange=function () {
    //4代表的意思是交互完成
    if(xhr.readyState!=4) return;
     //200值的是正常交互完成
     //404文件未找到
     //500 内部程序出错
     (xhr.status==200)?callback.success(xhr.responseText,xhr.responseXML):
     callback.failure(xhr.status);
   }
   //打开链接
   xhr.open(method,url,true);
   //设置参数
   if(method!="POST"){
    postVars=null;
   }
   xhr.send(postVars);
  },
  //2,获取xhr的方法--不同浏览器不一样
  createXhrObject:function () {
   var methods=[
    function () {return new XMLHttpRequest();},
    function () {return new ActiveXObject("Microsoft.XMLHTTP");}
   ];
   //利用try--catch 制作一个智能循环体
      for(var i=0;i<methods.length;i++){
       try{
        methods[i]();
       }catch(e) {
        continue;//回到循环开始的地方重新开始
       }
       this.createXhrObject=methods[i]();//非常重要,只有这样才能确保不用每一次请求,全循环数组
       return methods[i]();
      }
   //如果全不对则报错
   throw new Error("error");
  }
 };

第三步,使用检验

(1)实例化对象

var myHandler=new SimpleHandler();

(2)接口检验实现类是否完全实现接口中的方法

Interface.ensureImplement(myHandler,AjaxHandler);
//检验是否实现接口中所有方法

(3)定义一个回调对象

var callback={
  success:function (responseText) {
   alert("ok");
  },
   failure:function (status) {
   alert(status+"failure")
   }
  };

(4)最终的使用格式

myHandler.request("POST","http://www.baidu.com",callback);
//若url为""会默认为本地的链接,其他正确的链接,会出现跨域问题

感兴趣的朋友可以使用在线HTML/CSS/JavaScript代码运行工具:http://tools.3water.com/code/HtmlJsRun测试上述代码运行效果。

希望本文所述对大家JavaScript程序设计有所帮助。

Javascript 相关文章推荐
Js 获取Gridview选中行的内容操作步骤
Feb 05 Javascript
jquery select 设置默认选中的示例代码
Feb 07 Javascript
JS判断客户端是手机还是PC的2个代码
Apr 12 Javascript
js动态控制table的tr、td增加及删除的具体实现
Apr 30 Javascript
Javascript模拟加速运动与减速运动代码分享
Dec 11 Javascript
《JavaScript DOM 编程艺术》读书笔记之DOM基础
Jan 09 Javascript
js实现网页右上角滑出会自动消失大幅广告的方法
Feb 27 Javascript
jquery实现很酷的网页顶部图标下拉菜单效果
Aug 22 Javascript
H5图片压缩与上传实例
Apr 21 Javascript
js学习总结_基于数据类型检测的四种方式(必看)
Jul 04 Javascript
JavaScript实现多叉树的递归遍历和非递归遍历算法操作示例
Feb 08 Javascript
JS实现简易留言板增删功能
Feb 08 Javascript
JavaScript设计模式--简单工厂模式定义与应用案例详解
May 23 #Javascript
基于element-ui封装可搜索的懒加载tree组件的实现
May 22 #Javascript
微信小程序点击滚动到指定位置的实现
May 22 #Javascript
使用JavaScript通过前端发送电子邮件
May 22 #Javascript
uni-app微信小程序登录授权的实现
May 22 #Javascript
jQuery 选择器用法实例分析【prev + next】
May 22 #jQuery
jQuery--遍历操作实例小结【后代、同胞及过滤】
May 22 #jQuery
You might like
Apache设置虚拟WEB
2006/10/09 PHP
PHP中10个不常见却非常有用的函数
2010/03/21 PHP
如何用php生成扭曲及旋转的验证码图片
2013/06/07 PHP
浅析PHP绘图技术
2013/07/03 PHP
laravel Task Scheduling(任务调度)在windows下的使用详解
2019/10/22 PHP
在JavaScript里嵌入大量字符串常量的实现方法
2013/07/07 Javascript
jquery+json实现数据二级联动的方法
2015/11/28 Javascript
jQuery实例—选项卡的简单实现(js源码和jQuery)
2016/06/14 Javascript
jquery仿京东侧边栏导航效果
2017/03/02 Javascript
详解如何从零开始搭建Express+Vue开发环境
2018/07/17 Javascript
使用vue实现各类弹出框组件
2019/07/03 Javascript
微信小程序获取当前位置和城市名
2019/11/13 Javascript
JS实现简单移动端鼠标拖拽
2020/07/23 Javascript
解决VantUI popup 弹窗不弹出或无蒙层的问题
2020/11/03 Javascript
[01:10:58]KG vs TNC 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/16 DOTA
[54:18]DOTA2-DPC中国联赛 正赛 PSG.LGD vs LBZS BO3 第一场 1月22日
2021/03/11 DOTA
详解PyTorch批训练及优化器比较
2018/04/28 Python
Python CVXOPT模块安装及使用解析
2019/08/01 Python
pytorch载入预训练模型后,实现训练指定层
2020/01/06 Python
Python找出列表中出现次数最多的元素三种方式
2020/02/24 Python
python数据类型可变不可变知识点总结
2020/03/06 Python
Python GUI编程学习笔记之tkinter事件绑定操作详解
2020/03/30 Python
Python3与fastdfs分布式文件系统如何实现交互
2020/06/23 Python
10行Python代码实现Web自动化管控的示例代码
2020/08/14 Python
Python 利用Entrez库筛选下载PubMed文献摘要的示例
2020/11/24 Python
html5 Web SQL Database 之事务处理函数transaction与executeSQL解析
2013/11/07 HTML / CSS
顶级宝石首饰网络零售商:Angara
2016/10/25 全球购物
Ajax的优点和缺点
2014/11/21 面试题
户外婚礼策划方案
2014/02/08 职场文书
安全生产实施方案
2014/02/23 职场文书
2014乡镇领导班子四风对照检查材料思想汇报
2014/10/05 职场文书
师范生见习报告范文
2014/11/03 职场文书
大学体育课感想
2015/08/10 职场文书
《司马光》教学反思
2016/02/22 职场文书
HTML5页面音频自动播放的实现方式
2021/06/21 HTML / CSS
仅用几行Python代码就能复制她的U盘文件?
2021/06/26 Python