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检测网络是否具体连接功能的代码
May 23 Javascript
Angularjs结合Bootstrap制作的一个TODO List
Aug 18 Javascript
EditPlus 正则表达式 实战(3)
Dec 15 Javascript
将鼠标焦点定位到文本框最后(代码分享)
Jan 11 Javascript
angular实现图片懒加载实例代码
Jun 08 Javascript
原生JS封装animate运动框架的实例
Oct 12 Javascript
vue使用axios时关于this的指向问题详解
Dec 22 Javascript
vue脚手架搭建过程图解
Jun 06 Javascript
vue filters的使用详解
Jun 11 Javascript
微信小程序Getuserinfo解决方案图解
Aug 24 Javascript
微信小程序实现简单表格
Feb 14 Javascript
Node.js web 应用如何封装到Docker容器中
Sep 01 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调用Twitter的RSS的实现代码
2010/03/10 PHP
php动态生成函数示例
2014/03/21 PHP
php判断用户是否手机访问代码
2015/06/08 PHP
简单谈谈PHP中的trait
2017/02/25 PHP
Laravel 默认邮箱登录改成用户名登录的实现方法
2019/08/12 PHP
php数值计算num类简单操作示例
2020/05/15 PHP
Jquery替换已存在于element上的event的方法
2010/03/09 Javascript
js采用map取到id集合组并且实现点击一行选中一行
2013/12/16 Javascript
JavaScript中Math对象方法使用概述
2014/01/02 Javascript
获取select元素被选中的文本内容的js代码
2014/01/29 Javascript
js操作IE浏览器弹出浏览文件夹可以返回目录路径
2014/07/14 Javascript
js和jquery中循环的退出和继续下一个循环
2014/09/03 Javascript
javaScript中with函数用法实例分析
2015/06/08 Javascript
jQuery实现无限往下滚动效果代码
2016/04/16 Javascript
jQuery的promise与deferred对象在异步回调中的作用
2016/05/03 Javascript
jQuery 跨域访问解决原理案例详解
2016/07/09 Javascript
smartupload实现文件上传时获取表单数据(推荐)
2016/12/12 Javascript
javascript对HTML字符转义与反转义
2018/12/13 Javascript
python学习笔记:字典的使用示例详解
2014/06/13 Python
Linux下将Python的Django项目部署到Apache服务器
2015/12/24 Python
python bmp转换为jpg 并删除原图的方法
2018/10/25 Python
对python中的乘法dot和对应分量相乘multiply详解
2018/11/14 Python
Python正则表达式实现简易计算器功能示例
2019/05/07 Python
python lxml中etree的简单应用
2019/05/10 Python
numpy库与pandas库axis=0,axis= 1轴的用法详解
2019/05/27 Python
基于Python把网站域名解析成ip地址
2020/05/25 Python
Python使用Selenium实现淘宝抢单的流程分析
2020/06/23 Python
通过Python实现Payload分离免杀过程详解
2020/07/13 Python
HTML5的postMessage的使用手册
2018/12/19 HTML / CSS
新加坡第一大健康与美容零售商:屈臣氏新加坡(Watsons Singapore)
2020/12/11 全球购物
如果有两个类A,B,怎么样才能使A在发生一个事件的时候通知B
2016/03/12 面试题
前台文员岗位职责
2013/12/28 职场文书
卖车协议书范例
2014/09/16 职场文书
先进班集体事迹材料
2014/12/25 职场文书
安全学习心得体会范文
2016/01/18 职场文书
SQL Server中使用判断语句(IF ELSE/CASE WHEN )案例
2021/07/07 SQL Server