注:本文中部分描述都是操作我的书《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);