- 问题情境:
充斥多层嵌套的分支,代码繁复 - 解决思路
把函数从大化小,每一层抽象成一个方法,方法间解耦。 - 具体做法
1.链表结构,每一层是一个节点,包含该层方法和指向下一层的指针。用两个函数分别指定下一层函数(函数1)和调用函数(函数2)。难点和精髓是,函数2(passRequest)是个递归函数,先调用this,若this无法解决则进入递归,并把下一级节点作为this传递进去。
Chain.prototype.passRequest = function(){
var ret = this.fn.apply (this, arguments);//调用本层函数
if (ret === "nextSuccessor"){
//传递给下一层
return this.successor && this.successor.passRequest.apply(this.successor, arguments);
return ret;
}
2.用AOP实现职责链
神奇的after函数:
Function.prototype.after = function (fn) {
var self = this;
return function () {
var ret = self.apply(this, arguments);
if (ret === 'nextSuccessor') {
return fn.apply(this, arguments);
}
return ret;
}
}
var order = a.after(b).after©;
order(arguments)即可即可a(arguments)–>b(arguments)–>c(arguments顺序执行。