前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >JavaScript设计模式--简单工厂模式例子---XHR工厂

JavaScript设计模式--简单工厂模式例子---XHR工厂

作者头像
wfaceboss
发布2019-04-08 10:54:45
4260
发布2019-04-08 10:54:45
举报
文章被收录于专栏:wfaceboss

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

   (1)引入接口文件

代码语言:javascript
复制
//定义一个静态方法来实现接口与实现类的直接检验
//静态方法不要写出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接口

代码语言:javascript
复制
 var AjaxHandler=new Interface("AjaxHandler",["request","createXhrObject"]);

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

 (1)定义一个空类

代码语言:javascript
复制
  var   SimpleHandler=function(){};

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

代码语言:javascript
复制
    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)实例化对象

代码语言:javascript
复制
  var myHandler=new SimpleHandler();

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

代码语言:javascript
复制
  Interface.ensureImplement(myHandler,AjaxHandler);//检验是否实现接口中所有方法

(3)定义一个回调对象

代码语言:javascript
复制
   var callback={
        success:function (responseText) {
            alert("ok");
        },
         failure:function (status) {
            alert(status+"failure")
            }
        };

(4)最终的使用格式

代码语言:javascript
复制
   myHandler.request("POST","http://www.baidu.com",callback);//若url为""会默认为本地的链接,其他正确的链接,会出现跨域问题
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2017-10-16 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档