【问题标题】:Maintaining Private State维持私有状态
【发布时间】:2012-03-24 06:20:21
【问题描述】:

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

假设我们有 file1:

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

【问题讨论】:

  • 你的第二个 sn-p 没有返回任何东西。我不确定你为什么要用undefined 覆盖Module
  • @pimvdb:这是我的错误。我确实返回了 myModule

标签: javascript oop design-patterns access-modifiers private-members


【解决方案1】:

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

所以所有这些意大利面都是为了安全delete myModule._private

【讨论】:

  • 但 myModule 是传递给此文件的对象。更改作为输入的 myModule._private 变量在设计方面是否正确?
  • 我认为目标是在 c# 中实现部分类之类的东西。在这种情况下,您希望将输入和返回值视为同一类的对象 - 因此您应该有可能访问和更改来自其他文件(但相同模块)的“私有”变量。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多