详解JavaScript中“链式闭包模式”

注:本文中部分描述都是操作我的书《JavaScript高级应用与实践》而言,还请朋友们多多支持我的书,详情请见:

博主网站地址:

http://m9m.3322.org/doc/js/md00.jsp

“北京电子工业出版社”地址

http://www.phei.com.cn/bookshop/bookinfo.asp?bookcode=TP061230%20&booktype=main

其实,“链式闭包模式”在第2章2.1节中的D部分已经描述,本节就其原理进行通用化的封装。它将为你解决团队开发中多人编写不同的onload函数并进行一次串联执行的问题,同时为你解决多继承扩展中的种种问题——在下一节中你会看到“链式闭包模式”在其中的应用。
所谓的“链式”,是指调用一个对象的方法后返回的是这个对象自身,也就是返回this,因此可以进行链式调用。所谓“闭包”是指由于JavaScript中的变量没有像Java、C++那样的块作用域(块通常用{}包含起来),而只有function范围的作用域,再加上函数中的匿名函数赋予一个函数之外的变量,也就是函数之外有变量(也叫句柄、指针)引用了函数内部定义的匿名函数,这时候当这个变量没有被delete或赋予null,则调用这个函数时,JavaScript的虚拟机会保留和这个匿名函数同级的所有变量,直到这个引用句柄被销毁(指向匿名对象的链接被断开),这些function作用域的变量才得以清除。具体请看下面的设计。
// 封装:链式闭包模式
function linkClosedMode()
{
var _this = this;
// 仅仅起到 function 引用对象占位的作用
// 以便 start 中第一次调用的时候不至于对无效的 function 进行调用
_this.start = function(){return _this;};
// 请参阅第 2 2.1 D " 闭包链式模式 "
_this.add = fnPrivateFunc(func)
{
var oLstFunc = _this.start;
_this.start = function()
{
// apply(this, arguments) ,使得 start 的所有参数带入链路中的所有函数
oLstFunc.apply(this, arguments);
func.apply(this, arguments);
// 当若不加下面的 3 行,则创建的 linkClosedMode 实例调用 start 后,如果在调用 add
// 函数加入其他的方法,再次执行 start 的时候,会把之前的一并执行
// ——下面 3 行代码的目的:使得 linkClosedMode 实例调用 start 后成为以讹干净的对象
delete oLstFunc;
delete _this.start;
_this.start = function(){};
};
return _this;
};
for(var i = 0, j = arguments.length; i < j; i++)
_this.add(arguments[i]);
return this;
}
// 使用 : 这些被 add 的方法能正确获得 start 调用的时候传入的所有参数
new linkClosedMode().add(function()
{
alert(" 加入的第一个方法,参数: " + Array.apply(null, arguments));
}).add(function()
{
alert(" 加入的第二个方法,参数: " + Array.apply(null, arguments));
}).add(function()
{
alert(" 加入的第三个方法,参数: " + Array.apply(null, arguments));
}).start(" 参数 1", 324,55);
// 或者:
new linkClosedMode(function()
{
alert(" 加入的第 1 个方法,参数: " + Array.apply(null, arguments));
},function()
{
alert(" 加入的第 2 个方法,参数: " + Array.apply(null, arguments));
},function()
{
alert(" 加入的第 3 个方法,参数: " + Array.apply(null, arguments));
}).start(10000, 99);

你可能感兴趣的:(JavaScript,设计模式,jsp,asp,出版)