2

我正在阅读有关在具有相同模块的文件中使用JavaScript的私有状态维护。维护私有状态

假设我们有文件1:

var Module = (function(){ 
    //Some private variables declared. 
    // and initialized. 

})(); 

,我们有文件2:

var Module = (function(myModule){ 
    //Here the same private variables are required. 
    // And the following implementation enables it. 
    var _private = myModule._private = myModule._private || {}, 
    _seal = myModule._seal = myModule._seal || function() { 
     delete myModule._private; 
     delete myModule._seal; 
     delete myModule._unseal; 
    }, 
    _unseal = myModule._unseal = myModule._unseal || function() { 
     myModule._private = _private; 
     myModule._seal = _seal; 
     myModule._unseal = _unseal; 
    };  

    return myModule; 
}(Module || {})); 

的一部分,我无法明白的是var _private = myModule._private = myModule._private || {},

我想var _private = myModule._private || {}会做同样的事情。为什么按照上述方式完成?而且不会deleting myModule._private, myModule._seal and myModule._unseal使其无法进一步使用?但文章说,它通过维护模块的私有状态来封装和解密用于其他文件的私有变量。有关这种模式的任何提示或见解?

,我指的是文章是this

+0

您的第二个片段不会返回任何内容。我不确定你为什么用'undefined'覆盖'Module'。 – pimvdb 2012-03-06 18:17:58

+0

@pimvdb:它是我的错。我确实返回myModule – Ajai 2012-03-06 18:21:06

回答

1

在开始的时候,myModule._private可以是不确定的。如果是这样,var _private = myModule._private || {}将始终将_private设置为{},并将myModule._private保留为undefined(导致删除未定义),而较长的代码将设置myModule._private为{},如果未定义,则在其他情况下保持不变,并且然后做_private = myModule._private;

所以这一切意大利面只是为了做安全delete myModule._private

+0

,但myModule是传递给此文件的对象。在设计上更改myModule._private变量作为输入是否正确? – Ajai 2012-03-06 18:35:17

+0

我认为目标是在c#中实现类似部分类的东西。在这种情况下,您希望将输入和返回值视为同一类的对象 - 所以您应该有权访问和更改来自其他文件(但同一模块)的“私有”变量。 – synek317 2012-03-06 19:00:23