.net语言中有委托这个概念,委托的本质可以说是面向对象语言中安全的函数指针,javascript语言标准中虽然没有委托概念,但是却可以使用委托。因为在javascript是一个基于对象的语言,函数也是对象,所以自然就可以作为参数传递,于是也就可以使用委托机制。

这里举一个委托在异步调用中例子,来说明委托的用法,例子是对XmlHttp的简单封装:

<script type="text/javascript">
<!--
/*
* XmlHttp 类
*/
var XmlHttp = function() {
    var o = null;
    
    var readyStateChange = function(processResponseProc) {
        if (o.readyState == 4) {
            if (o.status == 200) {
                processResponseProc(o.responseText);
            } else {
                processResponseProc(null);
            }
        }
    };

return {
        /*
        * init 方法
        *
        * 返回值
        * 如果初始化成功则返回true,否则返回false
        *
        * 说明
        * 初始化XmlHttp对象,
        */
        init : function() {
            if (o == null) {
                if (window.XMLHttpRequest) {
                    try {
                        o = new XMLHttpRequest();
                    } catch (ex) {
                        return false;
                    }
                } else if (window.ActiveXObject) {
                    try {
                        o = new ActiveXObject("Msxml4.XMLHttp");
                    } catch (ex) {
                        try {
                            o = new ActiveXObject("Msxml2.XMLHttp");
                        } catch (ex) {
                            try {
                                o = new ActiveXObject("Microsoft.XMLHttp");
                            } catch (ex) {
                                return false;
                            }
                        }
                    }
                }
            }

return true;
        },

/*
        * get 方法
        *
        * 参数
        * url - 要请求的url
        * processResponse - 处理返回结果委托
        *
        * 返回值
        * 如果请求发起成功则返回true,否则返回false
        *
        * 说明
        * 发起http请求
        */
        get : function(url, processResponse) {
            try {
                o.open("GET", url, true);
                o.onreadystatechange = function() { readyStateChange(processResponse); };
                o.send();
                return true;
            } catch (ex) {
                return false;
            }
        },

/*
        * post 方法
        *
        * 参数
        * url - 要请求的url
        * data - 发送的数据,注意这里值必须是urlencode过的
        * processResponse - 处理返回结果委托
        *
        * 返回值
        * 如果请求发起成功则返回true,否则返回false
        *
        * 说明
        * 发起post请求
        */
        post : function(url, data, processResponse) {
            processResponseProc = processResponse;
            try {
                o.open("POST", url, true);
                o.onreadystatechange = function() { readyStateChange(processResponse); };
                o.setRequestHeader("Content-Length", data.length);
                o.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
                o.send(data);
                return true;
            } catch (ex) {
                return false;
            }
        }
    };
};

var xmlhttp = new XmlHttp();
if (xmlhttp.init()) {
    xmlhttp.get("http://pstgroup.blogspot.com/", function(response) {
        if (response != null) {
            document.write(response);
        }
    });
}
//-->
</script>

这里get和post方法都是异步调用,都需要传入有一个processResponse参数,这个参数是http返回内容处理函数,也就是我们所说的委托概念,对象内部会在http请求返回后回调该函数来处理返回的内容,委托这个词很形象,XmlHttp类并不知道调用者要对返回结果干些什么,于是就委托给这个传递近来的函数来做。

委托可以很好的降低不同功能之间的耦合,这个例子使用委托就符合Open-Close原则,如果有新的处理返回结果的需求可以很容易扩展,不用改动现有代码,比如我们的新需求是alert返回结果:

var xmlhttp = new XmlHttp();
if (xmlhttp.init()) {
    xmlhttp.get("http://pstgroup.blogspot.com/", function(response) {
        if (response != null) {
            alert(response);
        }
    });
}

委托之所以适合异步调用,是因为异步调用符合委托的使用场景:调用者A调用被调用者B,由于调用过程是异步的,不会立刻返回结果,所以B在拿到返回结果时,有需要依赖于A来处理结果。当在类设计时发现类之间双向互相依赖的情况时,可以考虑使用委托。

转载于:https://www.cnblogs.com/wscript/archive/2007/09/11/889530.html

javascript设计模式漫谈之使用委托相关推荐

  1. JavaScript设计模式与开发实践——JavaScript的多态

    "多态"一词源于希腊文polymorphism,拆开来看是poly(复数)+ morph(形态)+ ism,从字面上我们可以理解为复数形态. 多态的实际含义是:同一操作作用于不同的 ...

  2. 《JavaScript设计模式与开发实践》阅读摘要

    <JavaScript设计模式与开发实践>作者:曾探 系统的介绍了各种模式,以及js中的实现.应用,以及超大量高质量代码,绝对值得一读 面向对象的js 静态类型:编译时便已确定变量的类型 ...

  3. javascript 设计模式_开发者都应该了解的7种JavaScript设计模式

    你好,欢迎收听极客视点. JavaScript 中的设计模式指的是一些可重用的解决方案,这些方案适用于编写 JavaScript Web 应用程序时常见的一些问题.最近,全栈开发人员德文(Deven) ...

  4. javascript设计模式_开发者都应该了解的7种JavaScript设计模式

    你好,欢迎收听极客视点. JavaScript 中的设计模式指的是一些可重用的解决方案,这些方案适用于编写 JavaScript Web 应用程序时常见的一些问题.最近,全栈开发人员德文(Deven) ...

  5. JavaScript设计模式(一)

    设计模式概念 设计模式(Design Pattern)是一套被反复使用.多数人知晓的.经过分类的.代码设计经验的总结. 使用设计模式的目的:为了代码可重用性.让代码更容易被他人理解.保证代码可靠性. ...

  6. JavaScript设计模式——单例模式的理解与应用

    JavaScript设计模式--对单例模式的一些见解 JavaScript设计模式主要分类: ①创建型设计模式,例如单例模式.工厂模式 ②结构型设计模式,例如装饰者模式.适配器模式 ③行为型设计模式, ...

  7. JavaScript设计模式返璞归真

    闲话 本文写于2月初,原分享在有道云笔记上,现在转移到此.现阶段对于设计模式的理解还没有能力对本文的框架做出大的翻新,所以暂且原样搬过来了. 本文不从名目众多的设计模式谈起,而是为语言能力.代码优化. ...

  8. 《JavaScript设计模式 张》整理

    最近在研读另外一本关于设计模式的书<JavaScript设计模式>,这本书中描述了更多的设计模式. 一.创建型设计模式 包括简单工厂.工厂方法.抽象工厂.建造者.原型和单例模式. 1)简单 ...

  9. JavaScript设计模式浅析

    JavaScript设计模式浅析 JavaScript设计模式浅析 一.工厂模式 1.简单的工程模式 2.工程模式实例 二.建造者模式 1.建造者模式例子 三.单体模式 1.普通创建对象方式 2.单体 ...

最新文章

  1. 爬虫基础, 乱码问题, jupyter, urllib, requests, lxml, multiprocessing并发, session, beautifulsoup...
  2. JavaScript实现跳跃游戏的贪婪方法的算法(附完整源码)
  3. java合并整形_Java:合并InputStreams(Java: merging InputStreams)
  4. Mysql查询数据库状态及信息
  5. 统计各个函数的耗时_分享一次CMS GC耗时狠高优化过程全记录
  6. tinyxml 读取文本节点_在Windows下使用TinyXML-2读取UTF-8编码包含中文字符的XML文件...
  7. RedisTemplate常用集合使用说明-opsForValue(二)
  8. SQL server 数据库 (函数篇 2)
  9. mysql下载环境_windows下安装mysql需要什么环境
  10. java day31【web概念概述 、HTML】
  11. Oracle 查看 SQL执行计划 SQL性能分析
  12. CIF、DCIF、D1分辨率是多少?
  13. 计算机三级-数据库技术
  14. IDM下载出现503错误
  15. 创新实训(11)——推荐系统实现之基于流行度和新鲜度的推荐
  16. kindle4.1.1越狱
  17. 《影响力》(你为什么会说“是”?)读书
  18. 社会生活——《哥哥又逃票了》
  19. 进栈,出栈的详细知识
  20. 65款实用Chrome插件推荐

热门文章

  1. fragment 使用抽屉栏的_iPhone 这些使用小技巧,我不说你可能不知道哦
  2. 测量接线导通问题解决方案
  3. 室外声音信标可行性分析
  4. 位置传感器:电位器,电容位置传感器
  5. python之路 mysql 博客园_教为学:Python学习之路(二):MySQLdb的几种安装方式,以及用Python测试连接MySql...
  6. python的认识_理解 Python 中的 *args 和 **kwargs
  7. usb扩展坞同时接键盘鼠标_这个多功能扩展坞,增加多个接口,笔记本秒变工作站...
  8. linux 检测添加磁盘空间,Linux构造磁盘空间满的测试环境
  9. 百融金服榕树_百融金服榕树成为拉动新金融行业增长的主力军
  10. 实现费用管理 mysql_移动电费房租管理系统的设计与实现(IDEA,MySQL)