Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/385.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 模块模式中的私有变量_Javascript_Design Patterns_Module_Private - Fatal编程技术网

Javascript 模块模式中的私有变量

Javascript 模块模式中的私有变量,javascript,design-patterns,module,private,Javascript,Design Patterns,Module,Private,我不清楚private的概念,如果我仍然可以通过public方法访问它并重新定义模块的属性的话。我是说,我完全可以做到: var aModule = (function() { var privateVar = 1; return { publicFunction: function() { return privateVar; } } })(); aModule.publicFunction = funct

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

我知道如果我用let或const在ES6中编写它,这是不可能的,因为如果试图覆盖私有变量的值,它会给我带来错误,但是它在ES5中有什么意义呢?

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

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

作用域是不同的,因为它在哪里被调用,并且它不能访问那个私有变量

var aModule=(函数(){
var-privateVar=1;
返回{
publicFunction:function(){
返回privateVar;
}
}
})();
aModule.newFunction=函数(){
//尝试更改aModule中的privateVar
privateVar=3
};
aModule.newFunction();
log(aModule.publicFunction())//还是1不是3
//这就是它真正的结局

console.log(window.privateVar)
私有变量不能被拥有该私有变量的模块或类之外的代码访问或更改

例如,您不能执行
aModule.privateVar
并期望它能给您任何回报

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

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

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

var aModule=(函数(){
var-privateVar=1;
返回{
publicFunction:function(){
返回privateVar;
},
getPrivateVar(){
返回privateVar;
}
}
})();
aModule.publicFunction=函数(){
privateVar=函数(){
log(“新内容”);
}
privateVar();
};
aModule.publicFunction();/'“新内容”

log(aModule.getPrivateVar())//输出1
在javascript中,“私有变量”的概念比较松散。这些变量被认为是私有的,因为它们不能从自身范围之外的范围访问。它们通常以区别字符开头,如
\u privateVar
。不,您不能覆盖
privateVar
。您所做的是覆盖
publicFunction
(使用全局的、不同的“
privateVar
”)非常感谢!!是的,就是这样。现在我在我的示例中看到,我的新“privateVar”在全局范围内。我现在明白了:)