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 判断checkbox是否选中的实现代码
Nov 23 Javascript
jquery实现的让超出显示范围外的导航自动固定屏幕最顶上
Sep 22 Javascript
向当前style sheet中插入一个新的style实现方法
Apr 01 Javascript
jquery $.each() 使用小探
Aug 23 Javascript
javascript实现随机读取数组的方法
Aug 03 Javascript
详解 javascript中offsetleft属性的用法
Nov 11 Javascript
js实现前端分页页码管理
Jan 06 Javascript
js实现网页的两个input标签内的数值加减(示例代码)
Aug 15 Javascript
详解Vue.js组件可复用性的混合(mixin)方式和自定义指令
Sep 06 Javascript
利用JS判断客户端类型你应该知道的四种方法
Dec 22 Javascript
20道JS原理题助你面试一臂之力(必看)
Jul 22 Javascript
JS实现百度搜索框
Feb 25 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
php获取mysql数据库中的所有表名的代码
2011/04/23 PHP
php curl的深入解析
2013/06/02 PHP
利用php递归实现无限分类 格式化数组的详解
2013/06/08 PHP
PHP Session 变量的使用方法详解与实例代码
2013/09/11 PHP
PHP中实现获取IP和地理位置类分享
2015/02/10 PHP
php获取网页里所有图片并存入数组的方法
2015/04/06 PHP
PHP微信支付开发实例
2016/06/22 PHP
很全的显示阴历(农历)日期的js代码
2009/01/01 Javascript
JavaScript中双叹号!!作用示例介绍
2014/09/21 Javascript
js实现按钮加背景图片常用方法
2014/11/01 Javascript
Js得到radiobuttonlist选中值的两种方法(推荐)
2016/08/25 Javascript
vue v-on监听事件详解
2017/05/17 Javascript
Vue.js 中的 $watch使用方法
2017/05/25 Javascript
js+html5实现复制文字按钮
2017/07/15 Javascript
angular4 JavaScript内存溢出问题
2018/03/06 Javascript
浅谈React之状态(State)
2018/09/19 Javascript
使用angular-cli webpack创建多个包的方法
2018/10/16 Javascript
vscode 远程调试python的方法
2017/12/01 Python
Python使用爬虫抓取美女图片并保存到本地的方法【测试可用】
2018/08/30 Python
wxPython之wx.DC绘制形状
2019/11/19 Python
Python datetime 格式化 明天,昨天实例
2020/03/02 Python
python sitk.show()与imageJ结合使用常见的问题
2020/04/20 Python
CSS3中:nth-child和:nth-of-type的区别深入理解
2014/03/10 HTML / CSS
浅谈CSS3特性查询(Feature Query: @supports)功能简介
2017/07/31 HTML / CSS
"序列点" 是什么
2016/07/29 面试题
单位门卫岗位职责
2013/12/20 职场文书
房地产销售经理岗位职责
2014/01/01 职场文书
小学生期末自我鉴定
2014/01/19 职场文书
环保倡议书300字
2014/05/15 职场文书
不错的求职信范文
2014/07/20 职场文书
岗位安全生产责任书
2014/07/28 职场文书
党在我心中演讲稿
2014/09/02 职场文书
大三学生学年自我鉴定
2014/09/12 职场文书
解除劳动关系协议书2篇
2014/11/28 职场文书
pytorch实现ResNet结构的实例代码
2021/05/17 Python
MySQL下使用Inplace和Online方式创建索引的教程
2021/05/26 MySQL