本文深入探讨JavaScript闭包的高级应用场景,包括通过自执行函数扩展现有模块方法、在重载中保留旧方法引用、利用闭包实现对象的浅层克隆,以及通过加锁与解锁机制管理跨文件的私有变量共享。
模块方法的动态扩展
扩展
代码示例:
具体实现代码如下:
var blogModule = (function (my) {
my.AddPhoto = function () {
// 添加内部业务逻辑代码
};
return my;
}(blogModule));原理说明:
将模块自身作为参数传入方法中,从而实现了方法的动态扩展,这种模式类似于零件的组装过程。
方法重载与旧方法保留
代码示例:
具体实现代码如下:
var blogModule = (function (my) {var oldAddPhotoMethod = my.AddPhoto;
my.AddPhoto = function () { // 重载方法,依然可通过oldAddPhotoMethod调用旧的方 }; return my;}(blogModule));原理说明:
这种模式的优势在于可以在重写方法的同时,保留并调用原有的旧方法。
对象的浅层克隆与继承
克隆与继承
代码示例:
具体实现代码如下:
var blogModule = (function (old) { var my = {}, key; for (key in old) { if (old.hasOwnProperty(key)) { my[key] = old[key]; } } var oldAddPhotoMethod = old.AddPhoto; my.AddPhoto = function () { // 克隆以后,进行了重写,当然也可以继续调用oldAddPhotoMethod }; return my; } (blogModule));原理说明:
这是一种简单的对象克隆实现方式。
跨文件私有变量的加锁与解锁
跨文件共享私有对象
代码示例:
具体实现代码如下:
var blogModule = (function (my) { var _private = my._private = my._private || {}, _seal = my._seal = my._seal || function () { delete my._private; delete my._seal; delete my._unseal; }, _unseal = my._unseal = my._unseal || function () { my._private = _private; my._seal = _seal; my._unseal = my._unseal; }; return my; } (blogModule || {}));原理说明:
通过调用 blogModule._seal() 进行上锁,以及 _unseal() 进行开锁,从而实现了内部变量的私有化。虽然这种实现方式未必是最优解,但我们可以从中学习这种加锁与解锁的功能机制。