模块模式中的私有变量

时间:2017-11-24 15:06:15

标签: javascript design-patterns module private

我不清楚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'

据我所知,如果我用ES或者const在const中编写它是不可能的,因为它会给我错误尝试覆盖私有变量的值,但它在ES5中有什么意义呢?

2 个答案:

答案 0 :(得分:1)

私有变量无法通过拥有私有变量的模块或类之外的代码访问或更改。

例如,您无法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的访问权限,因为它们共享范围。

但是,在该功能之外,我们处于不同的范围,除了在返回的对象中公开的变量之外,它们无法访问aModule的变量

答案 1 :(得分:0)

您正在覆盖公共功能,无法访问模块私有变量

考虑以下作为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)