最新资讯当前位置:风暴娱乐 > 最新资讯 > >

JavaScript的Module模式编程深入分析(2)


  

  

在这种模式下,var语句是必须。如果导入的module并不存在就会被创建。这意味着你可以用类似于LABjs的工具来并行加载这些module的文件。

  

  

紧拓展  

  

虽然松拓展已经很棒了,但是它也给你的module增添了一些局限。最重要的一点是,你没有办法安全的重写module的属性,在初始化的时候你也不能使用其他文件中的module属性(但是你可以在初始化之后运行中使用)。紧拓展包含了一定的载入顺序,但是支持重写,下面是一个例子(拓展了我们最初的MODULE)。

  

  

代码如下:

  
var MODULE = (function (my) {  
var old_moduleMethod = my.moduleMethod;  

  

my.moduleMethod = function () {  
// method override, has access to old through old_moduleMethod...

  
};  

  

return my;  
}(MODULE));  

  

  

这里我们已经重写了MODULE.moduleMethod,还按照需求保留了对原始方法的引用。

  

  

复制和继承  

  

代码如下:

  
var MODULE_TWO = (function (old) {  
var my = {},  
key;  

  

for (key in old) {  
if (old.hasOwnProperty(key)) {  
my[key] = old[key];  
}  
}  

  

var super_moduleMethod = old.moduleMethod;  
my.moduleMethod = function () {  
// override method on the clone, access to super through super_moduleMethod  
};  

  

return my;  
}(MODULE));  

  

  

这种模式可能是最不灵活的选择。虽然它支持了一些优雅的合并,但是代价是牺牲了灵巧性。在我们写的代码中,那些类型是对象或者函数的属性不会被复制,只会以一个对象的两份引用的形式存在。一个改变,另外一个也改变。对于对象来说[g5] ,我们可以通过一个递归的克隆操作来解决,但是对于函数是没有办法的,除了eval。然而,为了完整性我还是包含了它。

  
  
跨文件的私有状态  

  

把一个module分成多个文件有一很大的局限,就是每一个文件都在维持自身的私有状态,而且没有办法来获得其他文件的私有状态。这个是可以解决的,下面这个松拓展的例子,可以在不同文件中维持私有状态。

  

  

代码如下:

  
var MODULE = (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 = _unseal;  
};  

  

// permanent access to _private, _seal, and _unseal  

  

return my;  
}(MODULE || {}));  

  

  

每一个文件可以为它的私有变量_private设置属性,其他文件可以立即调用。当module加载完毕,程序会调用MODULE._seal(),让外部没有办法接触到内部的 _.private。如果之后module要再次拓展,某一个属性要改变。在载入新文件前,每一个文件都可以调用_.unsea(),,在代码执行之后再调用_.seal。

  

  

这个模式在我今天的工作中想到的,我从没有在其他地方见到过。但是我认为这是一个很有用的模式,值得单独写出来。

  

  

Sub-modules  

  

最后一个高级模式实际上是最简单的,有很多创建子module的例子,就像创建一般的module一样的。

  

  

代码如下:

  
MODULE.sub = (function () {  
var my = {};  
// ...

  

  

return my;  
}());  

  

  

虽然这可能是很简单的,但是我决定这值得被写进来。子module有一般的module所有优质的特性,包括拓展和私有状态。

  

  

总结  

  

大多数高级模式都可以互相组合来创建更有用的新模式。如果一定要让我提出一个设计复杂应用的方法的话,我会结合松拓展,私有状态,和子module。

  

  

在这里我没有提到性能相关的事情,但是我可以说,module模式对于性能的提升有好处。它可以减少代码量,这就使得代码的载入更迅速。松拓展使得并行加载成为可能,这同样提升的载入速度。初始化的时间可能比其他的方法时间长,但是这多花的时间是值得的。只要全局变量被正确导入了运行的时候就不会出问题,在子module中由于对变量的引用链变短了可能也会提升速度。 (责任编辑:admin)

上一篇:JS中实现replaceAll的方法(实例代码)

下一篇:没有了

推荐内容

  • 共3页:
  • 上一页
  • 1
  • 2
  • 3
  • 下一页
  • 客户服务热线

    010-400-12345

    在线客服