我有点困惑,我怎样才能创建公共和私人会员。
到目前为止,我的代码模板如下:
(function()){
var _blah = 1;
someFunction = function() {
alert(_blah);
};
someOtherFunction = function() {
someFunction();
}
}();
答案 0 :(得分:14)
您可能想要使用Yahoo Module Pattern:
myModule = function () {
//"private" variables:
var myPrivateVar = "I can be accessed only from within myModule."
//"private" method:
var myPrivateMethod = function () {
console.log("I can be accessed only from within myModule");
}
return {
myPublicProperty: "I'm accessible as myModule.myPublicProperty."
myPublicMethod: function () {
console.log("I'm accessible as myModule.myPublicMethod.");
//Within myProject, I can access "private" vars and methods:
console.log(myPrivateVar);
console.log(myPrivateMethod());
}
};
}();
您定义的私人会员定义了myPrivateVar
和myPrivateMethod
,以及定义myPublicProperty
和myPublicMethod
的公开会员。
您可以按如下方式访问公共方法和属性:
myModule.myPublicMethod(); // Works
myModule.myPublicProperty; // Works
myModule.myPrivateMethod(); // Doesn't work - private
myModule.myPrivateVar; // Doesn't work - private
答案 1 :(得分:1)
您没有。 You can rely on convention,将_
添加到您的私有属性中,然后不使用不应该使用它的代码触及它们。
答案 2 :(得分:1)
在javascript中,每个对象成员都是公共的。最流行的声明私有字段的方法是在其名称中使用下划线符号,只是为了让其他人知道这是私有字段:
a = {}
a._privateStuff = "foo"
隐藏变量的另一种方法是使用javascript中的范围:
function MyFoo {
var privateVar = 123;
this.getPrivateVar = function() {
return privateVar;
}
}
var foo = new MyFoo();
foo.privateVar // Not available!
foo.getPrivateVar() // Returns the value
以下是详细解释此技术的文章:
答案 3 :(得分:1)
三件事:
<强> IIFEs:强>
您似乎需要刷新有关此模式的知识。在再次使用IIFE之前,请查看this帖子。
全球公众与安全公众:
使用var
和someFunction
跳过someOtherFunction
关键字会导致在全局范围内注册这些函数对象,即,可以从代码中的任何位置调用和重新分配这些函数。随着代码规模的扩大,这可能会导致一些严重的错误。相反,正如Daniel建议的那样,使用模块模式。虽然你可以使用其他方法,比如Constructors,Object.create()等,但实现起来非常简单。
/* create a module which returns an object containing methods to expose. */
var someModule = (function() {
var _blah = 1;
return {
someFunction: function() {},
someOtherFunction: function() {}
};
})();
/* access someFunction through someModule */
someModule.someFunction();
// ...
// ....
/* after 500+ lines in this IIFE */
/* what if this happens */
someFunction = function() {
console.log("Global variables rock.");
};
/* Fortunately, this does not interfere with someModule.someFunction */
公约和范围合并:
我们不能指望每个开发人员都遵循下划线或大写惯例。如果他们中的一个忘记实现这种技术怎么办?我们可以将两者结合起来,而不仅仅依赖于约定(_private
,GLOBAL
)和范围(函数范围)。这有助于保持编码风格的一致性并提供适当的成员安全性。所以,如果下次有人忘记大写他们的全局变量,控制台(严格模式)可以阻止世界结束。
答案 4 :(得分:0)
Javascript没有真正的私人会员。如果你真的需要隐私,你必须滥用范围。
答案 5 :(得分:0)