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 相关文章推荐
javascript的trim,ltrim,rtrim自定义函数
Sep 21 Javascript
jQuery 1.5 源码解读 面向中高阶JSER
Apr 05 Javascript
让浏览器非阻塞加载javascript的几种方法小结
Apr 25 Javascript
js调用activeX获取u盘序列号的代码
Nov 21 Javascript
左侧是表头的JS表格控件(自写,网上没有的)
Jun 04 Javascript
模拟用户点击弹出新页面不会被浏览器拦截
Apr 08 Javascript
JavaScript中数组的合并以及排序实现示例
Oct 24 Javascript
AngularJS中的指令全面解析(必看)
May 20 Javascript
xtemplate node.js 的使用方法实例解析
Aug 22 Javascript
React Native实现简单的登录功能(推荐)
Sep 19 Javascript
jstree创建无限分级树的方法【基于ajax动态创建子节点】
Oct 25 Javascript
详解写好JS条件语句的5条守则
Feb 28 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
PHPMailer邮件发送的实现代码
2013/05/04 PHP
php 去除html标记--strip_tags与htmlspecialchars的区别详解
2013/06/26 PHP
php实现简单的权限管理的示例代码
2017/08/25 PHP
PHP通过curl获取接口URL的数据方法
2018/05/31 PHP
PHP自动生成缩略图函数的源码示例
2019/03/18 PHP
Javascript 网页黑白效果实现代码(兼容IE/FF等)
2010/04/23 Javascript
js jquery获取随机生成id的服务器控件的三种方法
2013/07/11 Javascript
jquery导航制件jquery鼠标经过变色效果示例
2013/12/05 Javascript
Jquery 实现table样式的设定
2015/01/28 Javascript
node.js集成百度UE编辑器
2015/02/05 Javascript
Javascript实现单例模式
2016/01/24 Javascript
AngularJS 路由详解和简单实例
2016/07/28 Javascript
bootstrap栅格系统示例代码分享
2017/05/22 Javascript
vue开发调试神器vue-devtools使用详解
2017/07/13 Javascript
Vue二次封装axios为插件使用详解
2018/05/21 Javascript
对vux点击事件的优化详解
2018/08/28 Javascript
详解小程序用户登录状态检查与更新实例
2019/05/15 Javascript
layUI使用layer.open,在content打开数据表格,获取值并返回的方法
2019/09/26 Javascript
Node.js设置定时任务之node-schedule模块的使用详解
2020/04/28 Javascript
Python魔术方法详解
2015/02/14 Python
探索Python3.4中新引入的asyncio模块
2015/04/08 Python
在Python中操作字符串之replace()方法的使用
2015/05/19 Python
举例讲解Django中数据模型访问外键值的方法
2015/07/21 Python
Python基础教程之内置函数locals()和globals()用法分析
2018/03/16 Python
centos 安装Python3 及对应的pip教程详解
2019/06/28 Python
python按比例随机切分数据的实现
2019/07/11 Python
pandas的to_datetime时间转换使用及学习心得
2019/08/11 Python
Django DRF APIView源码运行流程详解
2020/08/17 Python
python脚本第一行如何写
2020/08/30 Python
pycharm2020.2 配置使用的方法详解
2020/09/16 Python
lululemon美国官网:瑜伽服+跑步装备
2018/11/16 全球购物
意大利珠宝店:Luxury Zone
2019/01/05 全球购物
应届生财务会计求职信
2013/11/05 职场文书
政府信息公开实施方案
2014/05/09 职场文书
七夕情人节促销方案
2014/06/07 职场文书
工资收入证明
2014/10/07 职场文书