English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
一、概述
职责链模式(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(); }; }; };
Cada vez que utilizamos el constructor CreateDOM para crear un objeto, pasamos el objeto asociado a él (sí, es como una lista enlazada).
Luego, cuando desencadenamos un objeto y ejecutamos el método handle, podemos seguir esta cadena.
Pero, hay que prestar atención, ¿cómo seguir transmitiendo hacia abajo cuando la propiedad handle de un objeto sobrescribe la de la cadena de prototipos?
Basta con usar CreateDOM.prototype.handle.call(this);.
Por lo tanto, el código para implementar li, ul y div es el siguiente:
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); }; };
Eso es todo el contenido de este artículo, espero que ayude en su aprendizaje y que todos apoyen a la tutoría de grito.
Declaración: el contenido de este artículo se ha obtenido de la red, y los derechos de autor pertenecen al propietario original. El contenido ha sido contribuido y subido por usuarios de Internet, este sitio web no posee los derechos de propiedad, no ha sido editado por humanos y no asume ninguna responsabilidad legal relacionada. Si encuentra contenido sospechoso de infracción de derechos de autor, le invitamos a enviar un correo electrónico a: notice#w)3codebox.com (al enviar un correo electrónico, reemplace # con @ para denunciar y proporcione evidencia. Si se encuentra que el contenido infringe los derechos de autor, le agradecemos que envíe un correo electrónico a: notice#w)