【问题标题】:Private Variables in Module Pattern模块模式中的私有变量
【发布时间】:2018-05-08 14:59:24
【问题描述】:

private的概念我不清楚,如果我仍然可以通过public方法访问它并重新定义模块的属性。我的意思是,我完全可以做到:

var aModule = (function() {

    var privateVar = 1;

    return {
        publicFunction: function() {
            return privateVar;
        }
    }

})();

aModule.publicFunction = function() {
    privateVar = function() {
        console.log('a new content');
    }
    privateVar();
};

aModule.publicFunction(); // 'a new content'

我知道如果我在 ES6 中使用 let 或 const 编写它是不可能的,因为尝试覆盖私有变量的值时会出错,但它在 ES5 中有什么意义?

【问题讨论】:

  • 在 javascript 中,“私有变量”的概念更像是一个松散的想法。这些变量被认为是私有的,因为它们不能从它自己的范围之外访问。它们通常以区分字符开头,例如 _privateVar
  • 不,您不能覆盖privateVar。你所做的是覆盖publicFunction(使用全局的、不同的“privateVar”)

标签: javascript design-patterns module private


【解决方案1】:

您正在覆盖公共函数并且无法访问模块私有变量

考虑以下作为aModule 的属性创建的新函数,它试图仅更改var privateVar 的值

作用域不同,因为它被调用的地方,它不能访问那个私有变量

var aModule = (function() {

    var privateVar = 1;

    return {
        publicFunction: function() {
            return privateVar;
        }
    }

})();

aModule.newFunction = function() {
    // try to change privateVar in aModule 
    privateVar = 3
};

aModule.newFunction();

console.log(aModule.publicFunction()); //still 1 not 3
// here's where it actually ended up
console.log(window.privateVar)

【讨论】:

    【解决方案2】:

    私有变量不能被拥有私有变量的模块或类之外的代码访问或更改。

    例如,你不能做aModule.privateVar 并期望它给你任何回报。

    您的publicFunction 是Java(和其他编程语言)世界所说的“getter”。简单地说,它允许访问私有变量的值,而不允许对其进行写访问。

    在您的最后一个示例中,您实际上并没有覆盖私有变量。您只是在publicFunction 的范围内创建一个新变量并为其分配一个值。仅仅因为它也被命名为 privateVar 并不意味着它是同一个内存区域。

    我已添加到您的代码中来演示这一点

    var aModule = (function() {
    
            var privateVar = 1;
    
            return {
                publicFunction: function() {
                    return privateVar;
                },
                getPrivateVar() {
                    return privateVar;
                }
            }
    
        })();
    
        aModule.publicFunction = function() {
            privateVar = function() {
                console.log('a new content');
            }
            privateVar();
         };
    
         aModule.publicFunction(); // 'a new content'
         console.log(aModule.getPrivateVar()); //outputs 1

    要详细说明为什么会这样,一切都与范围有关。 privateVar 存在于匿名函数的作用域中。这个匿名函数返回一个对象,上面定义了几个函数。当函数被调用时,这个对象被分配给 aModule,但保留对 privateVar 的访问,因为它们共享范围。

    但是,在该函数之外,我们处于不同的范围内,它无法访问 aM​​odule 的变量,但返回对象中公开的变量除外

    【讨论】:

    • 非常感谢!!是的,就是这样。现在我在示例中看到我的新“privateVar”在全局范围内。我现在明白了:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多