这里有新鲜出炉的 Javascript 教程,程序狗速度看过来!
Javascript 是一种由 Netscape 的 LiveScript 发展而来的原型化继承的基于对象的动态类型的区分大小写的客户端脚本语言,主要目的是为了解决服务器端语言,比如 Perl,遗留的速度问题,为客户提供更流畅的浏览效果。
这篇文章主要为大家详细介绍了 JavaScript 职责链模式, 具有一定的参考价值,感兴趣的小伙伴们可以参考一下
一、概述
职责链模式(Chain of responsibility),就是使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系。将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理他为止。
貌似和数据结构中的链表一样。
但,不要搞混了,职责链可不等于链表哦,因为职责链可以在任何一个节点开始往下查找,而链表,则必须从头结点开始往下查找。
比如,DOM 事件机制中的冒泡事件就属于职责链,而捕获事件则属于链表。
二、利用职责链模拟冒泡
假设我们有三个对象:li、ul、div,三者关系图如下:
比如,当我们触发 li 对象时,如果 li 没有阻止冒泡,那么将会传递给 ul 对象,到了 ul,如果没有阻止冒泡,则会传递给 div 对象(假设这里 div 为根节点)。同理,ul、div。
看到这儿,很清楚适合用职责链模式,编写这样的需求。
但,怎么使用 JavaScript 实现职责链模式呢?
如下,我们可以通过原型链的方式构建基本架构:
- function CreateDOM(obj){
- this.next = obj || null;
- };
- CreateDOM.prototype = {
- handle: function(){
- if(this.next){
- this.next.handle();
- }
- }
- };
每当我们利用 CreateDOM 构造函数,创建一个对象时,就将与之关联的对象传递进去(嗯,这样很链表)。
然后,当我们触发某个对象,执行 handle 方法时,就可以沿着这条链,走下去了。
但,需注意,当某个对象的 handle 属性覆盖了原型链中的 handle 时,怎么继续往下传呢?
利用 CreateDOM.prototype.handle.call(this); 就好了。
So,实现 li、ul 和 div 代码如下:
- var li = null,
- ul = null,
- div = null;
- div = new CreateDOM();
- div.handle = function(stopBubble){
- console.log('DIV');
- if(stopBubble){
- return;
- }else{
- CreateDOM.prototype.handle.call(this);
- }
- };
- ul = new CreateDOM(div);
- ul.handle = function(stopBubble){
- console.log('UL');
- if(stopBubble){
- return;
- }else{
- CreateDOM.prototype.handle.call(this);
- }
- };
- li = new CreateDOM(ul);
- li.handle = function(stopBubble){
- console.log('LI');
- if(stopBubble){
- return;
- }else{
- CreateDOM.prototype.handle.call(this);
- }
- };
来源: http://www.phperz.com/article/17/0609/331813.html