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 相关文章推荐
jQuery插件windowScroll实现单屏滚动特效
Jul 14 Javascript
json实现添加、遍历与删除属性的方法
Jun 17 Javascript
jQuery异步提交表单的两种方式
Sep 13 Javascript
AngularJS实现路由实例
Feb 12 Javascript
js随机生成一个验证码
Jun 01 Javascript
JavaWeb表单及时验证功能在输入后立即验证(含用户类型,性别,爱好...的验证)
Jun 09 Javascript
JavaScript伪数组用法实例分析
Dec 22 Javascript
微信小程序封装的HTTP请求示例【附升级版】
May 11 Javascript
vue自定义表单生成器form-create使用详解
Jul 19 Javascript
解决VUE双向绑定失效的问题
Oct 29 Javascript
NUXT SSR初级入门笔记(小结)
Dec 16 Javascript
JavaScript代理模式原理与用法实例详解
Mar 10 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
mysql总结之explain
2012/02/27 PHP
编写兼容IE和FireFox的脚本
2009/05/18 Javascript
javascript中利用数组实现的循环队列代码
2010/01/24 Javascript
Js表格万条数据瞬间加载实现代码
2014/02/20 Javascript
java和javascript获取word文档的书签位置对比
2014/06/19 Javascript
jquery中filter方法用法实例分析
2015/02/06 Javascript
图解Sublime Text3使用技巧
2015/12/21 Javascript
浅谈JS中json数据的处理
2016/06/30 Javascript
BootStrap Table对前台页面表格的支持实例讲解
2016/12/22 Javascript
利用node.js本地搭建HTTP服务器
2017/04/19 Javascript
webuploader实现上传图片到服务器功能
2018/08/16 Javascript
微信小程序自定义toast弹窗效果的实现代码
2018/11/15 Javascript
vue-cli 3.0 版本与3.0以下版本在搭建项目时的区别详解
2018/12/11 Javascript
js中比较两个对象是否相同的方法示例
2019/09/02 Javascript
在vue中利用v-html按分号将文本换行的例子
2019/11/14 Javascript
[03:00]DOTA2-DPC中国联赛1月18日Recap集锦
2021/03/11 DOTA
Python获取当前时间的方法
2014/01/14 Python
Python3使用requests发闪存的方法
2016/05/11 Python
python批量设置多个Excel文件页眉页脚的脚本
2018/03/14 Python
python numpy数组中的复制知识解析
2020/02/03 Python
基于Python生成个性二维码过程详解
2020/03/05 Python
Anaconda的安装及其环境变量的配置详解
2020/04/22 Python
绘儿乐产品官方在线商店:Crayola.com
2019/09/07 全球购物
Timberland澳大利亚官网:全球领先的户外品牌
2019/12/10 全球购物
介绍一下write命令
2012/09/24 面试题
管理专员自荐信
2014/01/26 职场文书
元宵节晚会主持人串词
2014/03/25 职场文书
入职担保书怎么写
2014/05/12 职场文书
公司踏青活动方案
2014/08/16 职场文书
大学生入党自荐书
2015/03/05 职场文书
新员工试用期自我评价
2015/03/10 职场文书
校车安全管理责任书
2015/05/11 职场文书
2015年远程教育工作总结
2015/05/20 职场文书
个人催款函范文
2015/06/24 职场文书
优秀家长事迹材料(2016推荐版)
2016/02/29 职场文书
MySQL系列之八 MySQL服务器变量
2021/07/02 MySQL